2014-01-29 49 views
-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_castiAA,但我真的不想這樣做。

我必須用這種方式施放的情況如下: 接口iA定義了一個函數doSomething(iA* a)。我在類A中實現了這個功能。在函數內部,我需要A(它們不是iA的成員)的一些成員,所以我必須將iA* a投射到A*。由於我知道iA*A類型的對象,因爲使用的實現中存在ABC(否則,函數doSomething()將永遠不會在類A中調用),因此此演員表很安全。

這是一個糟糕的設計?我如何改進此設計以避免需要dynamic_cast

問候

+0

很難說如何在不知道細節的情況下改進設計。它可能需要重新設計。 –

+0

這對我來說確實看起來很糟糕。如果不知道你想要達到什麼目的,那麼無法說出一個好的設計。 –

回答

2

引入接口後,你不能假設一個類實現的iA是A(它可能是任何一些可能的[A0,A1,...的]。

離開你兩個選擇:

  • 降接口
  • 使用的dynamic_cast