2012-05-29 42 views
2

我有一個C++基類,它聲明瞭兩個不同的簽名的虛擬方法。重寫C++虛擬方法與多個簽名

只要我重寫派生類中的虛擬方法簽名之一,編譯器(g ++ 4.6.3和g ++ 4.7)就不能再將該方法與同一派生類中的第二個簽名進行匹配。

下面的示例代碼將無法編譯,如果我只定義SPECIALIZE_ONEARG 1。爲了得到它的重新編譯我還必須定義PASSTHRU_TWOARG 1。使用「中繼」的方法,因爲效率不理想因爲真正的類層次結構的要深很多,我不希望在調用基類的硬線。

這種行爲是具體到G ++或我只是試圖做一些未在C++的支持?

#define SPECIALIZE_ONEARG (0) 
#define PASSTHRU_TWOARG (0) 

class base 
{ 
public: 
    virtual int myMethod(char a)   { return 1; } 
    virtual int myMethod(char a, int b) { return 2; } 
}; 

class derived : public base 
{ 
public: 
#if SPECIALIZE_ONEARG 
    virtual int myMethod(char a)   { return 3; } 
#endif // SPECIALIZE_ONEARG 

#if PASSTHRU_TWOARG 
    virtual int myMethod(char a, int b) { return base::myMethod(a, b); } 
#endif // PASSTHRU_TWOARG 
}; 

int main(int argc, char* argv[]) 
{ 
    derived myObj; 

    return myObj.myMethod('a') * 10 + myObj.myMethod('b', 0); 
} 

回答

6

你的定義是隱藏定義從基類。爲了該定義可見在你的派生範圍,需要using base::myMethod

class derived : public base 
{ 
public: 
    using base::myMethod; // <--- here 

#if SPECIALIZE_ONEARG 
    virtual int myMethod(char a)   { return 3; } 
#endif // SPECIALIZE_ONEARG 

#if PASSTHRU_TWOARG 
    virtual int myMethod(char a, int b) { return base::myMethod(a, b); } 
#endif // PASSTHRU_TWOARG 
}; 
+0

完美的作品。謝謝你的幫助。 – RonnieBr

2

在派生類中,添加

using base::myMethod;