以下是代码:
#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
and b2d
与他们都指向的相同dd
。然而,价值b1d
and b2d
根据结果不同。我认为这可能与类型转换有关,但我不确定它是如何工作的。
有人对此有想法吗?
D
继承自B1
andB2
.
Since B1
是从第一个继承的B1
对象的一部分将首先被构造,然后是B2
然后将创建对象的一部分D
.
因此,当您将派生类型的指针强制转换为基类型时,您所看到的是这些部分在内存中的位置的差异。
b1d
and ddd
具有相同的地址,因为它们都指向内存中类的开头。
b2d
是偏移的,因为它指向的开始B2
部分D
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)