PPC的C/C++和人工智能学习笔记
每一篇学习笔记,都只是为了更好地掌握和理解

C++语言基础(8-1)_基类私有成员继承分析

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)

学习笔记未经允许不得转载:PPC的C/C++和人工智能学习笔记 » C++语言基础(8-1)_基类私有成员继承分析

分享到:更多 ()

评论 抢沙发

评论前必须登录!