2013-03-11 96 views
0

下面的代碼說明了這個問題。我正在嘗試僅使用接口(C++虛擬類)爲C++組件創建API。我有一個Base和Derived類,並有相應的IBase和IDerived接口,但是當我嘗試將IBase轉換爲Derived時,會導致錯誤。 錯誤C2594:'type cast':從'IBase *'到'Derived *'的模糊轉換如何使用接口(包括派生接口)正確地公開C++ API?

這似乎是一個合理的事情,我試圖去做哪個Java或C#不會眨眼睛。有沒有在C++中實現類似的方法

class IBase 
{ 
public : 
    virtual int method_A(void) = 0; 
    virtual int method_B(void) = 0; 
    virtual int method_C(void) = 0; 
}; 

class IDerived : public IBase 
{ 
public : 
    virtual int method_D(void) = 0; 
}; 

class Base : public IBase 
{ 
    int method_A(void) {return 1;}; 
    int method_B(void) {return 2;}; 
    int method_C(void) {return 3;}; 
}; 

class Derived : public IDerived, private Base 
{ 
public: 
    int method_D(void) {return 4;}; 
}; 

class HandleDerived 
{ 
public : 
    int handle_base(IBase * i_base) 
    { 
    Derived * derived = (Derived *) i_base; 
    return derived->method_D(); 
    } 
}; 
+2

使用虛擬繼承 – enobayram 2013-03-11 09:36:48

+2

...並且不使用C風格轉換。 ;-) – DevSolar 2013-03-11 09:48:59

回答

3

你在看什麼是多繼承。

  • IDerived,這是從IBase
  • Base得出,這是IBase

因此衍生,當你要處理的IBase指針如:您Derived源自Derived指針在你的函數handle_base()中,不清楚你指的是哪個IBase:來自的指針或Base

該解決方案可以使用public virtual繼承。但是,您應該查看關於此事的C++ FQA Light

有關「Java或C#不會眨眼皮」的評論並不完全符合標準。即使C++中的純虛擬基類仍然是,而不是一個接口(在Java的意義上說),即你仍然有一個多重繼承的例子。 Java的解決方案是區分類和接口; (其中之一)C++的解決方案是虛擬繼承。