2010-06-17 63 views
1

我在派生類中的虛擬方法有問題。這裏是我的(簡化的)C++類。編譯器沒有找到基類的方法

class Base 
    virtual method accept(MyVisitor1* v) { /*implementation is here*/ }; 
    virtual method accept(MyVisitor2* v) { /*implementation is here*/ }; 
    virtual method accept(MyVisitor3* v) { /*implementation is here*/ }; 

class DerivedClass 
    virtual method accept(MyVisitor2* v) { /*implementation is here*/ }; 

下使用造成VS 2005給: 「錯誤C2664: 'DerivedClass ::接受':無法從 'Visitor1 *' 轉換參數1 'Visitor2 *'」。

DerivedClass c; 
MyVisitor1 v1; 
c.accept(v1); 

我在期待編譯器爲我的DerivedClass找到並調用Base :: accept(MyVisitor1)。顯然這不起作用,但我不明白爲什麼。有任何想法嗎?

感謝,

保羅

+3

派生類是否真的從基類派生?它是公有繼承嗎? Base類中的方法是否也公開? – Patrick 2010-06-17 10:26:20

+0

你應該提供一些實際編譯的代碼。它看起來像DerivedClass實際上並不是從Base派生的,但由於提供的代碼不是C++,所以我們無法確定。 – 2010-06-17 10:26:31

+0

請發表實際的代碼。你確定你使用了公有繼承嗎? – 2010-06-17 10:26:50

回答

4

DerivedClassaccept成員隱藏具有相同名稱的基類中的任何成員,即使他們有不同的簽名。要包含它們,添加以下的DerivedClass定義:

using Base::accept; 

(我假設DerivedClass並從Base派生,你的代碼片段並沒有明確說)。

+0

這有效。我不知道關鍵字使用的這種用法。謝謝。 – Paul 2010-06-17 11:22:56