类继承链和指向每个类的指针

时间:2016-09-19 19:30:19

标签: c++ pointers inheritance

所以给出如下的简单代码:

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 ++文档在这种情况下指定指针值的确切行为,或者它更像编译器依赖的东西?

1 个答案:

答案 0 :(得分:2)

对象的布局更可能与您所显示的内容相反。

+----------------+ +     +
|    A (int)     | |     |
+----------------+ |  B  |
| delta  B (2 int) |     |  C
+------------------+     |
| delta  C (int)         |
+----------------------- +

当编译器使用这样的布局时,aPtrbPtrcPtr的数值是相同的。

我还没有听说过像你建议的那样创建对象布局的编译器。我并没有明确表示没有,只是我没有听说过它们。