2012-05-09 5 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 を見ることはできません。一方、次のコードは、[OK]をコンパイルします。これは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

クラス 'Derived'の先頭に' Using Base :: myFunc'を追加してみてください。 –

+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でも可能です。よくテストされたプログラムが他のオーバーロードへの呼び出しを暗黙に再バインドして別の呼び出しをしないようにしてください。

関連する問題