據我所知,菱形繼承產生歧義,它可以通過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