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