我有一個設計問題,我不知道如何以最佳方式處理。我希望我的代碼能夠成爲未來的證明,並且不會混亂和複雜(怪胎的困境)。dynamic_cast和多態性的最佳做法
目前我的設計有以下設置
derived class D derived class E
^ ^
| |
derived abstract class B -> derived class C
^ ^
| |
Abstract Base class A
類B
從A
階級,階層D
和類E
從B
類不同,C
從A
類的不同而不同。
由於這些類不同,我需要使用dynamic_cast
運算符。
A* a1 = new class C;
C* c1 = dynamics_cast<C*>(a1);
if(c1){ //Success!!!}
...
正如你所看到的,我會想要使用dynamic_cast
很多!我需要嘗試找到一個不錯的方法來做到這一點,但這不是完整的if()
聲明。
有沒有一個乾淨的方式做到這一點?我似乎記得在Scott Meyers的書中看到了一些東西,但我離家很遠,無法訪問它一兩個星期。
任何參考資料/例子將不勝感激。
而且如果需要的話我可以讓B
類到這將是一個類型的解決
B* d1 = new D;
B* e1 = new E;
但不理想的接口。
注:我加入這個例子來說明我目前的設計失敗
class A {...};
class B: public A {
public:
virtual std::vector<objectType1*>& getObjectType1();
};
class C: public B {
private:
void newFunction();
};
A* c1 = new C();
std::vector<objectType1*> example = c1->getObjectType1(); // Wrong; need dyanmic_cast :-(
沒有dynamic_cast
不能訪問getObjectType1()
的靜態類型A不知道這個功能。我需要重新思考我的設計。有任何想法嗎?
你似乎使用不同的意思是繼承,你沒有給我們關於爲什麼你需要沮喪的細節 - 你只是假設你需要。爲什麼? –
使用虛擬功能。 –
如果他們在某種程度上沒有「不同」,那麼就不會有任何問題,但是您意味着什麼重要的方式?如果你的意思是他們在提供額外的無關功能方面有所不同,並且你不想要一個胖接口,那麼這是不尋常的,醜陋但有效的,'dynamic_cast <>'可能是合理的。 'if(C * p = dynamic_cast(a1))...'是一個更簡潔,更好的範圍表示法。儘管如此,「B類接口是一種解決方案」對我來說毫無意義 - 你應該解釋你在每個類中放置了什麼類型的函數,因爲你可能做錯了。 –