【发布时间】:2011-07-27 01:21:17
【问题描述】:
我知道菱形继承会导致歧义,可以通过virtual Base Classes 使用继承来避免这种情况,问题不在于它。当类是多态的时,问题是关于菱形层次结构中最派生类的大小。这是一个示例代码和示例输出:
#include<iostream>
using namespace std;
class Base
{
public:
virtual void doSomething(){}
};
class Derived1:public virtual Base
{
public:
virtual void doSomething(){}
};
class Derived2:public virtual Base
{
public:
virtual void doSomething(){}
};
class Derived3:public Derived1,public Derived2
{
public:
virtual void doSomething(){}
};
int main()
{
Base obj;
Derived1 objDerived1;
Derived2 objDerived2;
Derived3 objDerived3;
cout<<"\n Size of Base: "<<sizeof(obj);
cout<<"\n Size of Derived1: "<<sizeof(objDerived1);
cout<<"\n Size of Derived2: "<<sizeof(objDerived2);
cout<<"\n Size of Derived3: "<<sizeof(objDerived3);
return 0;
}
我得到的输出是:
Size of Base: 4
Size of Derived1: 4
Size of Derived2: 4
Size of Derived3: 8
据我了解,Base 包含一个虚拟成员函数,因此,
sizeof Base = vptr 的大小 = 4 在这个环境中
Derived1 和 Derived2 类的情况类似。
这是我与上述情况相关的问题:Derived3 类对象的大小如何,这是否意味着 Derived3 类有 2 个 vptr?Derived3 类如何与这 2 个 vptr 一起工作,关于它使用的机制有什么想法吗?
类的大小作为编译器的实现细节留下而不是由标准定义(因为虚拟机制本身是编译器的实现细节)?
【问题讨论】:
-
关于标准问题。是的,如何实现虚拟方法的机制是一个实现细节,没有具体说明。是的,
sizeof的实际结果也是一个实现细节,它主要取决于指针大小,如果你在 64 位平台上,你会看到8/8/8/16。
标签: c++ sizeof virtual-inheritance diamond-problem memory-layout