2011-12-07 22 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