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



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

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

在当前标准中,一个类只有标准布局,如果在其他条件中,它:

要么在派生最多的类中没有非静态数据成员,最多有一个基类具有非静态数据会员,要么没有基类具有非静止数据会员

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

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

最新更新