[英]Class inheritance chain and pointers to each of classes
因此,给出如下简单代码:
class A{
public:
virtual void foo() const { cout << "foo in A." << endl;}
private:
int a;
};
class B: public A{int c;};
class C : public B{
public:
void foo() const override {cout << "foo in B." << endl;}
private:
int a;
int b;
};
现在,当我创建CI类型的对象时,可以想象它在内存中的布局,如下所示:
+----------------+
| C (int) |
|+--------------+|
|| B (+1) ||
||+------------+||
||| A (2int) |||
||+------------+||
|+--------------+|
+----------------+
所以现在简单的代码:
C objectC;
A* aPtr = &objectC;
B* bPtr = &objectC;
C* cPtr = &objectC;
我希望即使编译器生成代码,也可以使以下表达式返回true:
(aPtr == bPtr && bPtr == cPtr)
以下表达式应返回false:
((int)aPtr == (int)bPtr && (int)bPtr == (int)cPtr)
但是在我的电脑上,它也返回了true。 同样在打印出指针的数值后,它们也相同。
我的问题是为什么运行程序后没有得到预期的结果? 是否有一些C ++文档指定在这种情况下指针值的确切行为,或者更像是编译器相关的东西?
对象的布局很有可能与您所显示的相反。
+----------------+ + +
| A (int) | | |
+----------------+ | B |
| delta B (2 int) | | C
+------------------+ |
| delta C (int) |
+----------------------- +
有道理的是,当编译器使用这种布局时, aPtr
, bPtr
和cPtr
的数值将相同。
我还没有听说过有任何编译器可以创建您建议的对象布局。 我并不是要明确地说没有任何东西,只是我没有听说过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.