|
|
1
5
虚拟基对象位于属于该对象(大小为sizeof(object))的内存块中的某个位置。由于不同类型的多个子对象可以以不同的方式组合,但必须共享同一基本对象,因此每个子对象都需要一个偏移指针来查找虚拟基本对象。在没有虚拟继承的情况下,对于每个类类型,查找相应基对象的偏移量在编译时是固定的。 sizeof值取决于编译器和计算机,但以下假设非常常见: 假设:指针大小为4字节 假设:类大小四舍五入到4字节的倍数
真实的 计算必须准确地知道编译器是如何工作的。 奥利弗
例子:
D2可能的内存布局:
在第二种情况下,子对象B需要另一个偏移来找到它的基A D2类型的对象由一个内存块组成,其中包含所有父对象部分,即D2类型的对象的内存块具有a成员变量、C成员变量、B成员变量和D2成员变量的部分。这些部分的顺序依赖于编译器,但示例显示,对于多个虚拟继承,需要一个偏移指针,它指向 在内部 对象的总内存块到虚拟基对象。这是必要的,因为类B的方法只知道一个 这 这 指针。
上述计算可能是错误的;—)。。。 我不确定D部分是否有自己的vtable指针(这都高度依赖于编译器)。 我现在认为,可能是D部分使用其父类的vtable指针条目,4个额外的字节用于对齐每个部分(8字节的倍数): 所以这个计算可能更正确:
|
|
|
2
1
我对上述问题有三点分析 |
|
|
3
1
如果您的层次结构是这样的,没有任何虚拟继承:
那么
让B实际上从A继承是没有必要的。你唯一需要的虚拟继承是
当然,如果有其他类没有显示,它们继承自A和B,这会改变一些事情——也许
|
|
|
4
0
虚拟继承仅用于派生类从两个基类相乘继承的多重继承的某些情况,这些基类本身从公共基类继承。iostream库就是一个例子,其中istream和ostream继承自基本IO,而iostream继承自istream和ostream(因此一个iostream将有两个基本IO而没有虚拟继承)。
虚拟继承呢?在这种情况下,子类的对象是直接持有其超类的对象,还是只持有指向其超类的对象的指针?
|
|
|
5
0
比较:
|
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |