2011-06-21 18 views
1

考慮下面的代碼:私有繼承:我如何創建基類(擁有純虛擬方法)的對象?

class Base 
{ 
    protected: 
    virtual void methodDefinedInBase() = 0; 
} 

Class Derived: private Base 
{ 
    public: 
    void someMethod(); 
    protected: 
    virtual void methodDefinedInBase() 
    { 
    std::cout<<"From B"<<std::endl; 
    } 
} 

在上面的代碼中,我可以創建類型「派生」的對象。 C++允許我從Derived類中的「someMethod()」訪問方法「methodDefinedInBase()」。但是,如何創建一個「Base」類型的對象?

謝謝,

Vishnu。

+2

你不能。你爲什麼想要? – Beta

+0

基準中methodDefinedInBase「defined」的確切程度如何?它只在那裏宣佈。 – Andrei

+0

我試圖用私有繼承來實現組合。而我的自然衝動是創建一個「基礎」的對象,並將其添加到「派生」類。但是,我打敗了我自己的目的。實現一個私有繼承將強制組合。 :) –

回答

3

由於註釋中提到了Beta,因此您不能實例化抽象基類(一個使用純虛擬方法)。您只能實例化實現這些純虛方法的派生類。無論您是使用公有還是私有繼承,情況都是如此。

1

您不會創建「Base」類型的任何對象 - 通過給Base指定一個純粹的虛擬成員,您明確表示該類不能單獨存在,而只能通過派生類來存在。什麼你想創建的指針引用到基地:

Derived1 x; 
Derived2 y; 

// Somewhere inside Derived1: 
Base & rb = x; 

// Somewhere inside Derived2: 
Base * pb = &y; 

然後你就可以通過下述方法rbpb使用多態均勻而不需要知道具體類型的xy

+0

我抵制編輯你的答案的要求,在'rb'和'pb'的聲明中加'const' :-)但是,是的,很好的例子。 –

+0

@Dan:爲什麼是const?我不能使用非常量虛擬方法,或者沒有意義嗎? –

+0

除OP是從'Base'私下繼承的,所以他不能在'Base&' – Lambdageek

0

在基類中聲明純虛函數意味着:1.這樣的類的對象不能被實例化。 2.要實例化派生類的對象,必須定義所有純虛函數。換句話說,純虛擬方法不允許您在其中定義的類的對象創建。

相關問題