我知道菱形继承会导致歧义,可以通过使用继承来避免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 一起工作,关于它使用的机制有什么想法吗?
类的大小保留为编译器的实现细节而不由标准定义(因为虚拟机制本身是编译器的实现细节)?