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