gpt4 book ai didi

c++ - 多重继承 : Different Address same address

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:07 34 4
gpt4 key购买 nike

我写了一个示例程序。如果我打印 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,而是指向 AB c子对象 .

通过多重继承,来自基类的数据本质上是一个接一个地堆叠起来。基类型指针只是偏移到该基类的数据。正因为如此,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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com