Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在多重继承之后对类布局进行假设是否安全?_C++_Memory_Casting_Multiple Inheritance - Fatal编程技术网

C++ 在多重继承之后对类布局进行假设是否安全?

C++ 在多重继承之后对类布局进行假设是否安全?,c++,memory,casting,multiple-inheritance,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

据我所知,多重继承的顺序与被调用构造函数的顺序相同。这个问题是关于内存布局的

考虑以下代码段:

#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;
}

??还是取决于实施情况,然后依赖于它是不安全的?

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

未指定基类子对象在最派生对象(4.5)中的分配顺序


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

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

未指定基类子对象在最派生对象(4.5)中的分配顺序


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

不是答案,但是如果您使用
dynamic\u cast
并去掉
void*
,那么您就不需要这样做assumption@idclev463035818我同意,此示例更像是一个说明问题的示例。不是答案,但如果您使用
dynamic\u cast
并去掉
void*
,则不需要这样做assumption@idclev463035818我同意,这个例子更像是一个例子来说明这个问题。分配在这里到底意味着什么?它真的是指布局吗?@FlashMcQueen:不是。但是我的C-ish代码使用
strdup
,它在内部使用
alloc
分配一个动态字符数组。因此,当它不再使用时,必须释放它。分配在这里的确切含义是什么?它真的是指布局吗?@FlashMcQueen:不是。但是我的C-ish代码使用
strdup
,它在内部使用
alloc
分配一个动态字符数组。因此,当它不再使用时,必须释放它。
class C {
    public:
    int a;
    int b;
};

class D {
    public:
    int b;
    int a;
};