我写了一个示例程序。
如果我打印 pa 和 pb 的地址,两者都不一样。
你能告诉我为什么会这样吗?

#include<iostream>
using namespace std;
class A {
int x;
};

class B {
int y;
};

class C: public A, public B {
int z;
};

int main()
{
 C c;
 A *pa;
 B *pb;

 pa = &c;
 pb = &c;

cout<<pa<<endl;
cout<<pb<<endl;

}

最佳答案

正如 Kerrek SB 所说,示例中的 papb 实际上并不指向 c,而是指向 ABc 子对象。

通过多重继承,来自基类的数据本质上是一个接一个地堆叠。基类型指针只是偏移到该基类的数据。因此, papb 指向 c 的不同偏移量。

#include<iostream>
using namespace std;

class A {
    public:
    int x;
};

class B {
    public:
    int y;
};

class C: public A, public B {
    public:
    int z;
};

int main()
{
    C c;
    cout << "    &c: " << &c << endl << endl;

    cout << "(A*)&c: " << (A*)&c << endl;
    cout << "(B*)&c: " << (B*)&c << endl << endl;

    cout << "  &c.x: " << &c.x << endl;
    cout << "  &c.y: " << &c.y << endl;
    cout << "  &c.z: " << &c.z << endl << endl;
}

结果:
    &c: 0x7ffdfeb26b20

(A*)&c: 0x7ffdfeb26b20
(B*)&c: 0x7ffdfeb26b24

  &c.x: 0x7ffdfeb26b20
  &c.y: 0x7ffdfeb26b24
  &c.z: 0x7ffdfeb26b28

所以你可以看到 C 是这样布局的:
                  ---------------
0x7ffdfeb26b20    |     x       |     class A data
                  ---------------
0x7ffdfeb26b24    |     y       |     class B data
                  ---------------
0x7ffdfeb26b28    |     z       |     class C data
                  ---------------

如果你向这个例子添加一些虚方法,你会看到同样的事情发生在子类 vtables 上。

关于c++ - 多重继承 : Different Address same address,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31204335/

10-13 03:06