gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:54 25 4
gpt4 key购买 nike

我一直在为我正在从事的项目研究 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.

我的实验代码示例表明它们工作正常,但我对当事情变得复杂时它的实际工作方式有点困惑。

例如:

b * basePtr = new c;
cout << basePtr->b_data << endl;
b * basePtr = new d;
cout << basePtr->b_data << endl;

这每次都工作正常,即使是通过使用指针作为参数的函数调用也是如此。

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

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

最佳答案

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

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

关于C++ 和结构(多重继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14367408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com