所以给出如下的简单代码:
case 1:
现在,当我创建C类型的对象时,我可以想象它在内存中的布局如下:
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;
};
所以现在简单的代码:
+----------------+
| C (int) |
|+--------------+|
|| B (+1) ||
||+------------+||
||| A (2int) |||
||+------------+||
|+--------------+|
+----------------+
我希望,即使编译器生成代码,这使得以下表达式返回true:
C objectC;
A* aPtr = &objectC;
B* bPtr = &objectC;
C* cPtr = &objectC;
以下表达式应返回false:
(aPtr == bPtr && bPtr == cPtr)
但在我的电脑上,它也是真的。在打印出指针的数值后,它们也是相同的。
我的问题是为什么在运行程序后没有预期的结果?是否有一些C ++文档在这种情况下指定指针值的确切行为,或者它更像编译器依赖的东西?
答案 0 :(得分:2)
对象的布局更可能与您所显示的内容相反。
+----------------+ + +
| A (int) | | |
+----------------+ | B |
| delta B (2 int) | | C
+------------------+ |
| delta C (int) |
+----------------------- +
当编译器使用这样的布局时,aPtr
,bPtr
和cPtr
的数值是相同的。
我还没有听说过像你建议的那样创建对象布局的编译器。我并没有明确表示没有,只是我没有听说过它们。