代码如下:
#include <iostream>
using namespace std;
class B1 {
public:
virtual void f1() {
cout << "B1\n";
}
};
class B2 {
public:
virtual void f1() {
cout << "B2\n";
}
};
class D : public B1, public B2 {
public:
void f1() {
cout << "OK\n" ;
}
};
int main () {
D dd;
B1 *b1d = ⅆ
B2 *b2d = ⅆ
D *ddd = ⅆ
cout << b1d << endl;
cout << b2d << endl;
cout << ddd << endl;
b1d -> f1();
b2d -> f1();
ddd -> f1();
}
输出是:
0x79ffdf842ee0
0x79ffdf842ee8
0x79ffdf842ee0
OK
OK
OK
这让我感到困惑,因为我预计 b1d
和 b2d
会相同,因为它们都指向 dd
。但是,b1d
和b2d
的值根据结果不同。我认为这可能与类型转换有关,但我不确定它是如何工作的。
有人对此有想法吗?
最佳答案
D
继承自 B1
和 B2
。
由于 B1
是从第一个对象继承的,因此将首先构造对象的 B1
部分,然后是对象的 B2
部分然后将创建 D
。
因此,当您将派生类型的指针转换为基类型时,您看到的是这些部分在内存中的不同之处。
b1d
和 ddd
具有相同的地址,因为它们都指向内存中类的开头。
b2d
是偏移量,因为它指向 D
的 B2
部分的开始。
关于c++ - C++中,为什么指针转换时地址变了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34744599/