-1
我定義我的項目中包含以下接口:C++向下轉換與虛基類
class iA
class iB : virtual public iA
class iC : virtual public iA
當我現在實現接口..
class A : virtual public iA
class B : virtual public iB, public A
class C : virtual public iC, public A
由於虛擬的,我不受鑽石繼承問題困擾。但現在,我想一個指針的iA向下轉換成A型
void func1(iA* a){
static_cast<A*>(a);
}
這是不可能的,因爲虛擬繼承iA
。我可以在類A
刪除virtual
關鍵字,但那麼我會遭受鑽石繼承問題。 我知道我可以用dynamic_cast
投iA
到A
,但我真的不想這樣做。
我必須用這種方式施放的情況如下: 接口iA定義了一個函數doSomething(iA* a)
。我在類A
中實現了這個功能。在函數內部,我需要A
(它們不是iA
的成員)的一些成員,所以我必須將iA*
a投射到A*
。由於我知道iA*
是A
類型的對象,因爲使用的實現中存在A
,B
和C
(否則,函數doSomething()
將永遠不會在類A
中調用),因此此演員表很安全。
這是一個糟糕的設計?我如何改進此設計以避免需要dynamic_cast
?
問候
很難說如何在不知道細節的情況下改進設計。它可能需要重新設計。 –
這對我來說確實看起來很糟糕。如果不知道你想要達到什麼目的,那麼無法說出一個好的設計。 –