#include <iostream> using namespace std; class Shape { private: //protected: int a; public: Shape(); Shape(int m):a(m){} int *geta(Shape*ss){return &ss->a;} virtual void show(){cout<<"a="<<a<<endl;} }; class Cir:public Shape { private: int b; public: Cir(); Cir(int m,int n):Shape(m),b(n){ b=*this->geta((Shape*)this); }//通过指针避开编译器获得基类private成员 int bar(Shape*f) { b=*f->geta(f); return b; } void show(){cout<<"b="<<b<<endl;} }; int main() { //Shape sh(1); Cir cir(1,2); cir.show();//b=1,注意b的值在构造函数中被a替代了,所以此处b不为2 //cir.bar(&sh);//a赋予b //cir.show();//b=1 system("pause"); return 0; }
//有一部分代码没有意义可以忽略
回避protected和private继承,只针对public继承对于类成员访问权限的限制:
private和protected基类中private成员,子类中无法直接使用(*即便是在类内部作用域中也不可访问*),类对象更加不可访问。上例使用指针回避编译错误,访问类子类中继承的private成员; ( 结合初始化成员列表的作用???)
基类中的protected成员,子类中可以直接使用,但类作用域外、类对象无法调用,相当于在子类定义中添加了该成员的protected定义protected是为了继承而生的三层控制层次,类内存在但不可访问,类内可访问类外不可访问,类内外都可访问。
private和protected继承区别
最新推荐文章于 2024-04-10 17:03:33 发布