C ++和结构(具有多重继承)

Dou*_*oug 5 c++ struct multiple-inheritance

我一直在为我正在研究的项目研究C ++和结构。目前,我正在使用“链接”模板结构以伪特征形式添加数据字段。

虽然有效,但我想我更喜欢多重继承,例如下面的示例:

struct a {
    int a_data;
}; // 'Trait' A

struct b {
    int b_data;
}; // 'Trait' B

struct c : public a, public b {
    int c_data;
}; // A composite structure with 'traits' A and B.

struct d : public b {
    int d_data;
}; // A composite structure with 'trait' B.
Run Code Online (Sandbox Code Playgroud)

我的实验代码示例显示它们可以正常工作,但是当事情变得复杂时,它的实际工作方式让我有些困惑。

例如:

b * basePtr = new c;
cout << basePtr->b_data << endl;
b * basePtr = new d;
cout << basePtr->b_data << endl;
Run Code Online (Sandbox Code Playgroud)

即使通过将指针作为参数的函数调用,每次也可以正常工作。

我的问题是代码如何知道b_data在派生结构之一中的存储位置?据我所知,这些结构仍使用没有额外数据的压缩结构(即3个int结构仅占用12个字节,2个int 8个字节等)。当然,它需要某种额外的数据字段来说明a_data和b_data在给定结构中的存储位置?

这更多地是一个好奇心问题,因为无论如何一切似乎都能奏效,并且如果正在使用多个实现,我很乐意接受一个示例。尽管我确实有点担心,因为我想通过进程间消息队列传递这些结构背后的字节,并想知道它们是否会在另一端被解码(所有使用该队列的程序都将被解码)。由相同的编译器编译并在单个平台上运行)。

Ker*_* SB 3

在这两种情况下,basePtrtrue都是指向 类型对象的指针b,因此没有问题。事实上,这个对象不是一个完整的对象,而是一个更派生的对象的子对象(这实际上是技术术语),这一事实并不重要。

d *从tob *以及从c *to的(静态、隐式)转换b *负责调整指针值,使其真正指向b子对象。所有信息都是静态已知的,因此编译器会自动进行所有这些计算。