我想知道来自多个继承级别的类数据成员是否在C ++编译器中连续分配。例如,如果我有以下类:
class Base
{
public:
int a;
};
class child_1 : public Base
{
public:
int b;
};
class child_2 : public child_1
{
public:
int c;
}
以下操作是否会运行并输出所有编译器的预期值?
child_2 my_obj;
my_obj.a = 3; my_obj.b = 2; my_obj.c = 1;
Base* base_ptr = (Base*)&my_obj;
int* int_ptr = (int*)base_ptr;
cout << "Output 3: " << *int_ptr << endl
<< "Output 2: " << *(int_ptr + 1) << endl;
<< "Output 1: " << *(int_ptr + 2) << endl;
此外,如果这是可能的,我是否需要从child_2 *类型到Base *类型的中间演员,如上所述,或者以下也是允许的?
int* int_ptr (int*)&my_obj;
请注意,我不是在问这是不是一个好主意。显然你会想要设计你的软件,这样你最终不会做这样的事情,但是我正在考虑这样一种解决问题的方法来处理一些旧的代码(由经验丰富的软件工程师制作,这使得它更复杂)。
我专门使用的编译器是VC ++ 2005。
答案 0 :(得分:3)
不,未指定派生类成员和基类成员的相对布局。
在当前标准中,如果在其他条件下,类只是标准布局:
在大多数派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有包含非静态数据成员的基类
在旧标准(适用于您的编译器)中,甚至没有标准布局的概念,只有POD,并且任何具有非空基类的类都不是POD
您的代码取决于特定编译器如何布置基类,并且不可移植。