类继承中访问控制间的区别
相信大家都知道一个派生类继承于一个基类的时候有三种方式的访问控制,分别为:public、protected和private。
例如:
View Code
class slider { public: void print () {cout<< "test!!" << endl;} }; class B_slider:public slider { };
class slider { public: void print () {cout<< "test!!" << endl;} }; class B_slider:protected slider { };
View Code
class slider { public: void print () {cout<< "test!!" << endl;} }; class B_slider:private slider { };
而且,大家也是会这么一个概念——父类指针可以指向子类,即子类指针可以隐式转换赋值于父类指针。同时,一般人都建议使用public这种访问控制。从而也没有深究在protected和private这两种访问控制的继承方式下,父类指针是否可以很顺利的指向子类。事实证明,在protected和private这两种访问控制的继承方式下,这种做法是非法的。
int main() { B_slider* p = new B_slider(); slider* q = p; return 0; }
在public的访问控制的继承方式下,这样是没问题的。
但是在protected和private的访问控制的继承方式下,就会出现以下的一个错误信息:
"error C2243: “类型转换”: 从“B_slider *”到“slider *”的转换存在,但无法访问"
原因在于子类通过protected和private的访问控制的继承方式于基类时,用户通过子类对象来访问子类继承于父类的成员是非法的。