2015-04-28 38 views
2

如果我有從一個接口(下圖)和wxPaneC++從接口的多個傳承和鑄造

class iClassA 
{ 
public: 
    virtual ~iClassA() {} 
    virtual bool FuncA() = 0; 
}; 

沈志南繼承的類:

class ConcereteClass : public iClassA, wxPane 
{ 
public: 
    bool FuncA(); 
}; 

是是可以接受的類型的std::vectoriClassA *包含我的ConcereteClass或者vmaps會在鑄造時感到困惑?

+1

什麼是'vmaps'?你期望什麼問題?通過基類存儲派生實例肯定沒有問題,這就是多態的全部內容。 – Quentin

+0

注意:'class ConcreteClass:public iClassA,public wxPane'!你寫的方式意味着** wxPane的私有繼承**:只有ConcreteClass意識到它繼承了它,並且外部世界不能訪問任何的wxPane成員/函數。 – Christophe

回答

6

是的,這是完全可以接受的。這也是一個很常見的模式。

std::vector<iClass*> v; 
v.push_back(new ConcreteClass); 
v[0]->FuncA(); // calls ConcreteClass::FuncA(); 

if (ConcreteClass* cc = dynamic_cast<ConcreteClass*>(v[0])) { 
    // succeeds 
} 

delete v[0]; // correctly calls ConcreteClass::~ConcreteClass() 

請注意,您是從wxPaneprivate LY繼承。

+0

啊,謝謝,我不確定concerete類中的任何數據是否會丟失,因爲它只作爲繼承樹的一部分存儲在地圖中 –

+1

另外,請注意,使用某種形式的而不是向量中的智能指針,那麼你明確了所有權和資源管理。 –