2012-05-09 90 views
1
class Base { 
public: 
    virtual void myFunc(double a, double b) { }; 
    virtual void myFunc(double a) { }; 

}; 

class Derived : public Base { 
public: 
    virtual void myFunc(double a) { return this->myFunc(a, 0.0); }; 
};          // ^^^^^^^^^^^^^^^^^^^^ 

上面的代碼將無法編譯:error C2660: 'Derived::myFunc' : function does not take 2 arguments 顯然編譯器不能看到,我想調用基類中定義的函數,或重寫它的任何功能。在另一方面,下面的代碼編譯確定:這是Visual 2010的編譯錯誤嗎?

class Base { 
public: 
    virtual void myFunc2(double a, double b) { }; 
    virtual void myFunc(double a) { }; 

}; 

class Derived : public Base { 
public: 
    virtual void myFunc(double a) { return this->myFunc2(a, 0.0); }; 
}; 

我覺得我試圖在第一個例子做的是合法的C++,所以這是在VS2010編譯器錯誤?我有VS2008

感謝

編輯相同的結果:一種解決方法,我發現是使用

virtual void myFunc(double a) { return ((Base*)this)->myFunc(a, 0.0); }; 

,但我不是100%肯定它具有完全相同的效果,任何人都可以確認?

+1

提示:這不是一個錯誤。 –

+3

嘗試添加一個'使用Base :: myFunc'到你的類'Derived'的開頭。 –

+0

[爲什麼派生類中的重寫函數隱藏了基類的其他重載?](http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the- derived-class-hide-other-overloads-of-the) – Tony

回答

7

此行爲是設計使然。

派生類中的函數hide other overloads in the base class

+0

所以這不會編譯其他任何東西?我不確定我是否看到這個限制點 – lezebulon

+0

@lezebulon:正確。我不確定爲什麼這是真的。 – SLaks

+0

http://stackoverflow.com/q/1628768/34397 – SLaks

0

這不是一個錯誤。

您在C選擇++繼承的重載是否應該被隱藏(這是更安全,默認行爲)或可用:

class Derived : public Base { 
public: 
    virtual void myFunc(double a) { return this->myFunc(a, 0.0); }; 
    using Base::myFunc; 
}; 

另外,也可以在功能點使用Base::myFunc語法呼叫。

在的第17.4.5.3和17.5節中,對名稱空間和超載之間的默認行爲有一個解釋。假設Base是一個庫類,而Derived是您的應用程序代碼。該庫的下一個版本肯定會對許多功能產生新的過載,甚至可能是myFunc,並且你當然不希望你的測試程序沉默地重新綁定它的myFunc調用其他重載並調用其他的東西。