C++基础,类的继承有个地方没弄明白,就是基类的私有成员到底有没有被派生类继承?因为除非通过基类的接口函数,在派生类里面也是无法直接访问的。
先来看一个测试例子:
class A {
int x, y;
};
class B :public A {
};
int main() {
cout << “A的大小:” << sizeof(A) << ” B的大小:” << sizeof(B) << endl;
//输出:A的大小:8 B的大小:8
//可以说明:A的私有成员是被B继承了的,只不过B好像不通过A的接口函数访问不到
return 0;
}
这个例子好像告诉我们,私有成员应该是被继承了的。
如果基类中没有提供访问私有成员的公有函数,那么其私有成员是否真的被继承了呢?实际上,这些私有成员是存在的,而且会被继承,只不过程序员无法通过正常的渠道访问到它们。
通过一种特殊的手段访问基类的私有成员:
#include <iostream> using namespace std; class A { int x; void p1() { cout << x << endl; } public: A() { x = 20; } ~A() {} }; class B :public A { public: int GetX() { //获取私有成员x int *p= reinterpret_cast<int*>(this);//获取当前对象的首地址 return *p; } void SetX(int x) { //设置私有成员x int *p = reinterpret_cast<int*>(this); *p = x; } void p2() { void(*f)() = NULL; _asm { mov eax, A::p1; mov f, eax; } f(); } }; int main() { B b; cout << b.GetX() << endl; //输出20,获得了基类中私有成员的值 b.SetX(30); //设置 x =30 cout << b.GetX() << endl; //输出30,说明设置私有成员成功 b.p2(); //输出 30,说明调用私有成员函数成功。 return 0; }
总结:
虽然类A没有提供访问私有成员变量x的公有方法,但是在类A(以及类A的派生类B)对象中,都包含成员变量x。
虽然类A并没有提供访问私有成员函数p1()的公有函数,但是在程序代码区依然存有函数p1()的代码,通过内联汇编获取该函数的入口地址,仍然可以调用。
所以:类的私有成员一定存在,也一定被继承到派生类中。只不过受到C++语法的限制,在派生类中访问基类的私有成员只能通过间接的方式进行。
(2017-03-24 www.vsppc.com)
评论前必须登录!
注册