在c++的继承关系中,如果一个派生类构建,那么构建顺序将是从基类开始,然后再到派生类,但是存在一个问题,派生类中的this指针和基类中this是否相同呢?基于此,所以我进行了一个简单验证。代码如下:
class A
{
private:
int value : 1;
public:
A() { cout << "A address = " << (unsigned long long)this << endl; }
void setA(int num) { value = num; }
};
class AA : public A
{
private:
int value : 1;
public:
AA() : A()
{
cout << "A address = " << (unsigned long long)this << endl;
}
void setA(int num) { value = num; }
};
class AAA : public AA
{
private:
int value : 1;
public:
AAA() : AA()
{
cout << "AA address = " << (unsigned long long)this << endl;
}
void setAA(int num) { value = num; }
};
int main()
{
AAA *p = new AAA();
return 0;
}
在上述代码中,A、AA、AAA是基类与派生类的关系,在它们的构造函数中,我进行this地址的打印,需要注意,这里不是&this,否则就成了保存this指针的地址。
经过运行,结果如下:
A address = 8329504
AA address = 8329504
AAA address = 8329504
结论:
- 基类地址和派生类地址相同。
为什么会这样呢?我画了一个简单的内存模型,就如俄罗斯套娃,A最先构造,所以它决定了整体的地址,然后AA在A的基础上扩展,AAA在AA的基础上扩展。
这也很好的解释了为什么一个基类指针如果其实际指向派生类,我们对其进行强转而不存在安全性问题,因为编译器只需要根据派生类的成员去从基类的首地址开始去解释后续内存中的内容即可。