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
的情況下執行此操作?
在此先感謝!
謝謝! 我的真實界面旨在抽象輸入設備,如鼠標或鍵盤。這個想法是創建一個接口,它抽象出兩個設備明確使用的方法,如buttonDown()或buttonUp()。只對一個特定設備有意義的方法只在派生類中,而不在接口中。因此,鼠標將擁有自己的getPosX(),這不應該在界面中,因爲像鍵盤這樣的設備永遠不需要這樣。所以我不希望在界面中有這個 - 也爲了避免不屬於輸入設備的方法調用。 – CelGene 2010-06-18 17:58:32
當你想將基類指針存儲在一個容器中時,'dynamic_cast'是最有用的。另一個常見用途是與庫/ API接口,這些庫允許您將一些自己的數據存儲在其某個結構中(如windows編程中的cbWndExtra)。但是大多數情況下,您編寫的代碼與基類指針/引用無關,不需要對派生類特定的接口進行任何操作。 – Cogwheel 2010-06-18 18:15:25