据我所知,菱形继承产生歧义,它可以通过virtual Base Classes
使用继承回避的是,问题不是它。当类是多态时,问题是关于菱形层次结构中派生最多的类的大小。下面是一个示例代码和输出样本:菱形多态继承:大多数的sizeof派生类
#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;
}
输出I得到的是:
Size of Base: 4
Size of Derived1: 4
Size of Derived2: 4
Size of Derived3: 8
据我所知Base
包含虚拟成员函数,因此,
的sizeof基地= vptr的的尺寸= 4在这种环境下
类似的情况Derived1
& Derived2
类。
这里是我的问题涉及到上述方案:
怎么样Derived3
类对象的大小,这是否意味着Derived3类有2 vptr的?
Derived3
类如何与这2个vptr一起工作,有关它使用的机制的任何想法?
Sizeof类的大小保留为未由标准定义的编译器&的实现细节(因为虚拟机制本身是编译器的实现细节)?
关于标准问题。是的,如何实现虚拟方法的机制是实现细节,而不是指定的。是的,sizeof'的实际结果也是一个实现细节,它主要取决于指针大小,如果你在64位平台上,你会看到'8/8/8/16'。 – 2011-03-31 18:12:38