2011-12-07 50 views
2

是否有可能在兩個抽象類之間建立組合關係(不是聚合)?抽象類之間的組合

我不這麼認爲,因爲我不能實例化一個抽象類。但也許有一個簡單的方法來做到這一點。

回答

4

是:

class A 
{ 
    virtual ~A() = 0; 
}; 


class B 
{ 
    virtual ~B() = 0; 
    A* mA; 
}; 

你被允許有一個指針來抽象類型。

+0

它不是A和B之間的聚合嗎? mA不住在B之外嗎?爲了建立毫安的一生的責任問候B,我應該把B ::〜B {刪除mA;} ...這是否正確? (如此虛擬〜B()而不虛擬〜B()= 0) – Ale

+0

不是必需的。責任是一個邏輯事物。您不必在B內部創建mA。您可以從外部指派它,並委託責任將其摧毀到課外。 –

0

您可以使用指針或對其他類的引用。例如:

class A { 
public: 
    virtual void m() = 0; 
    virtual ~A() { } 
}; 

class B { 
public: 
    virtual void m() = 0; 
    virtual ~A() { } 

private: 
    boost::scoped_ptr<A> a; 
}; 

在C++ 11可以使用std::unique_ptr代替。請注意,這使得B不可複製,這對使用子類型多態的類來說有點常見。

+0

您宣佈爲私人會員;由於B是抽象的,難道不是要宣佈它是受保護的嗎? – Ale