2013-08-22 57 views
1

如果我運行這段代碼虛基類的公共/私有構造函數的行爲差異

#include<iostream> 
using namespace std; 
class Final; 

class MakeFinal{ 
public: 
friend class Final; 
MakeFinal(){cout<<"makefinal\n";} 
}; 

class Final: public virtual MakeFinal{ 
public: 
Final(){cout<<"Final\n";} 
}; 

class Derived:public Final{ 
public: 
    Derived(){cout<<"Derived\n";} 
}; 


int main(){ 
//Final f; 
Derived d; 
return 0; 
} 

輸出是:

makefinal 最終 衍生

但是,如果我讓MakeFinal()構造私有,編譯器顯示錯誤消息。基於這個不同的構造函數調用層次結構是什麼?

+0

如果一個基類構造函數是私有的,那麼除了一個朋友類(或類本身)之外,其他任何東西都可以構造一個,包括通過繼承。 –

+1

拋開糟糕的格式,爲什麼你在這段代碼中首先使用虛擬繼承?你知道虛擬繼承有什麼問題可以解決嗎? – thokra

回答

1

參考:

C++ FAQs - virtual inheritance constructors http://www.parashift.com/c++-faq/virtual-inheritance-ctors.html

因爲事實如此,你最派生需求來調用「最派生類的構造函數初始化列表中直接調用虛基類的構造函數。」虛擬基地的構造者直接。因此,對於你想要做的事情,你需要將派生類派生成一個朋友......

此外,似乎你不能正確理解虛擬繼承。請參閱this FAQ瞭解虛擬繼承的用途和正確使用。

1

如果您A類有私有構造函數,你不能創建這個類像(see)的對象a

A a; 

當一個對象被創建BA派生類的b,基類的構造函數也必須被調用。如果它是私人的,它不能被調用,並且派生的對象不能被創建。

相關問題