在实现中,继承是连续分配的多个层的数据成员吗?

时间:2012-03-06 00:43:22

标签: c++ inheritance casting

我想知道来自多个继承级别的类数据成员是否在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。

1 个答案:

答案 0 :(得分:3)

不,未指定派生类成员和基类成员的相对布局。

在当前标准中,如果在其他条件下,类只是标准布局

  

在大多数派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有包含非静态数据成员的基类

在旧标准(适用于您的编译器)中,甚至没有标准布局的概念,只有POD,并且任何具有非空基类的类都不是POD

您的代码取决于特定编译器如何布置基类,并且不可移植。