繁体   English   中英

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

[英]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)         |
+----------------------- +

有道理的是,当编译器使用这种布局时, aPtrbPtrcPtr的数值将相同。

我还没有听说过有任何编译器可以创建您建议的对象布局。 我并不是要明确地说没有任何东西,只是我没有听说过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM