2010-06-18 82 views
0

我已經創建了一個接口來爲以後的擴展抽象部分源。但是如果我想用某些特殊的方法來擴展派生類呢? 所以我這裏的接口:擴展由接口派生的具體類的方法池

class virtualFoo 
{ 
public: 
virtual ~virtualFoo() { } 

virtual void create() = 0; 
virtual void initialize() = 0; 
}; 

和一個派生類的額外方法:

class concreteFoo : public virtualFoo 
{ 
public: 
concreteFoo() { } 
~concreteFoo() { } 

virtual void create() { } 
virtual void initialize() { } 

void ownMethod() { } 
}; 

所以我嘗試創建concreteFoo的實例,並嘗試調用ownMethod這樣的:

void main() 
{ 
virtualFoo* ptr = new concreteFoo(); 
concreteFoo* ptr2 = dynamic_cast<concreteFoo*>(ptr); 

if(NULL != ptr2) 
    ptr2->ownMethod(); 
} 

它的作品,但並不真正的優雅的方式。如果我試圖直接使用ptr->ownMethod();,編譯器會抱怨說這個方法不是virtualFoo的一部分。 是否有機會在不使用dynamic_cast的情況下執行此操作?

在此先感謝!

回答

1

這正是dynamic_cast的用途。但是,通常可以通過更改設計來避免使用它。既然你舉了一個抽象的例子,很難判斷你是否應該以不同的方式做事。

+0

謝謝! 我的真實界面旨在抽象輸入設備,如鼠標或鍵盤。這個想法是創建一個接口,它抽象出兩個設備明確使用的方法,如buttonDown()或buttonUp()。只對一個特定設備有意義的方法只在派生類中,而不在接口中。因此,鼠標將擁有自己的getPosX(),這不應該在界面中,因爲像鍵盤這樣的設備永遠不需要這樣。所以我不希望在界面中有這個 - 也爲了避免不屬於輸入設備的方法調用。 – CelGene 2010-06-18 17:58:32

+0

當你想將基類指針存儲在一個容器中時,'dynamic_cast'是最有用的。另一個常見用途是與庫/ API接口,這些庫允許您將一些自己的數據存儲在其某個結構中(如windows編程中的cbWndExtra)。但是大多數情況下,您編寫的代碼與基類指針/引用無關,不需要對派生類特定的接口進行任何操作。 – Cogwheel 2010-06-18 18:15:25