派生和基类对象的内存地址?

时间:2012-02-05 14:44:18

标签: c++

我试图找出Derived类和Base Class Object的地址,我发现它们是相同的。 实际上,我很困惑如何得到两者的地址?

#include<stdio.h>
class Base {
    public:
        Base ()
        {
            printf ("\n Base :: %p\n", this);
        }
        ~Base () { 
            printf ("\n Base::~Base\n");
        }
};

class Der:public Base {
    public:
        Der () {
            printf ("\n Der: %p \n", this);
        }
        ~Der () {
            printf ("\n Der:: ~Der\n");
        }
};

int main(void) {
    Base b;
    Der d;
    return 0;
}

2 个答案:

答案 0 :(得分:7)

子对象包含门的方式包含父对象。如果你问房子的坐标,我给你门的坐标,我是对的,是吗?特别是对于您提供的示例,其中没有数据成员且没有虚拟方法:子对象和父对象不仅具有相同的地址,而且具有相同的大小。

现在,如果你使用多重继承 - 如果ChildParent1Parent2派生 - 并且给两个父类数据成员以使它们具有非零大小,并且然后运行一个类似的诊断,你肯定会发现最多一个父对象与该子对象具有相同的地址。

最后,请注意,不同的编译器会为所有问题提供不同的答案:对象布局取决于编译器。

答案 1 :(得分:5)

假设您有一个包含两个数据成员的基类;它会像这样在记忆中展开:

member1 <-- object pointer points here
member2

如果派生类添加了更多成员,它将按如下布局:

member1 <-- object pointer points here
member2
member3
member4

因此,如果将派生类型的对象强制转换为基类型,则指针实际上不会更改。它仍指向记忆中的同一个地方。