我有一個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);
}
完美的作品。謝謝你的幫助。 – RonnieBr