c++ - 多重继承后对类布局进行假设是否安全?

标签 c++ memory casting multiple-inheritance

据我所知,多重继承情况下的顺序与被称为构造函数的顺序相同。这个问题是关于内存布局的吗?
考虑以下代码段:

#include <iostream>

class A {
    public:
    void seta() {a = 1;}
    int a;
};

class B {
    public:
    void setb() {b = 2;}
    int b;
};

class C : public A, public B {
};

class D : public B, public A {
};

int main() {
    C c;
    c.a = 1;
    c.b = 2;
    void * p1 = (void *)(&c);
    //if layout is as inheritance order, always displays C.a: 1 C.b: 1?
    std::cout << "C.a: " << ((A*)(p1))->a << " C.b: " << ((B*)(p1))->b << "\n";
    D d;
    d.a = 1;
    d.b = 2;
    void * p2 = (void *)(&d);
    //if layout is as inheritance order, always displays D.a: 2 D.b: 2?
    std::cout << "D.a: " << ((A*)(p2))->a << " D.b: " << ((B*)(p2))->b << "\n";
    return 0;
}
在评论中依靠这两个假设是否安全?
就内存布局而言,由于继承顺序,C和D对象等效于:
class C {
    public:
    int a;
    int b;
};

class D {
    public:
    int b;
    int a;
};
?还是取决于实现方式,然后依靠它是不安全的?

最佳答案

在n4659草案中,[class.derived]在§5中明确指出:

The order in which the base class subobjects are allocated in the most derived object (4.5) is unspecified.


可以说,除非有特定的实现指定,否则您不应该依赖基类子对象的顺序。

关于c++ - 多重继承后对类布局进行假设是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62571708/

相关文章:

c++ - 在二维数组中创建线性渐变

java - 模拟器中的 OutOfMemoryException

c++ - 如何确定 MSVC C++ 中的内存分配?

c# - 如何将对象转换为具有公共(public)无参数构造函数以遵守 : new() constraint?

Java 我可以在不知道其大小的情况下从文件恢复二维数组吗?

c++ - 从方法返回对 vector 的引用并使用其公共(public)成员

c++ - 使用 C++ 与 Stockfish shell 交互

c++ - 从二进制 dll 文件中删除 C++ 类名

c++ - 如何检查 malloc 是否持有锁

c++ - 将基础实例指针转换为派生实例指针是否合法? (该实例不是派生实例)