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在给定结构中的存储位置?
这更多地是一个好奇心问题,因为无论如何一切似乎都能奏效,并且如果正在使用多个实现,我很乐意接受一个示例。尽管我确实有点担心,因为我想通过进程间消息队列传递这些结构背后的字节,并想知道它们是否会在另一端被解码(所有使用该队列的程序都将被解码)。由相同的编译器编译并在单个平台上运行)。
在这两种情况下,basePtrtrue都是指向 类型对象的指针b,因此没有问题。事实上,这个对象不是一个完整的对象,而是一个更派生的对象的子对象(这实际上是技术术语),这一事实并不重要。
d *从tob *以及从c *to的(静态、隐式)转换b *负责调整指针值,使其真正指向b子对象。所有信息都是静态已知的,因此编译器会自动进行所有这些计算。