如果基类中并没有提供访问私有成员的公有函数,那么其私有成员是否“存在“呢?还会不会被继承呢?其实,这些私有成员的确是存在的,而且会被继承,只不过C++编译器杜绝了此种类型的访问。考察如下程序,通过内嵌汇编代码便可以访问类的私有成员。
#include <iostream> using namespace std; class A { int i; void privateFunc() { cout<<"this is a private function of base class"<<endl; } public: A(){i=5;} int getI() { return i; } void usePrivateFunc() { privateFunc(); } }; class B:public A { int j; public: void printBaseI() { cout<<getI()<<endl; } void usePrivateFunction() { usePrivateFunc(); } }; int main() { B b; b.printBaseI(); b.usePrivateFunction(); cout<<sizeof(A)<<" "<<sizeof(B)<<endl; system("pause"); } /* 5 this is a private function of base class 4 8 */
(1)虽然类A没有提供访问私有成员变量i的公有方法,但是在类A(以及类A的派生类)对象中,都包含变量i。
(2)虽然类A并没有提供访问私有成员函数privateFunc()的公有函数,但是在程序代码区依然存有函数privateFunc()的代码,通过内联汇编获取该函数的入口地址,仍然可以顺利调用。
综上所述,类的私有成员一定存在,也一定被继承到派生类中,从大小也可以看出派生类包含了基类的私有成员。只不过受到C++语法的限制,在派生类中访问基类的私有成员只能通过间接的方式进行。
参考:吕吕《C++进阶心法》
-End-