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 どうやらコンパイラは、私が Base クラスで定義された関数、またはそれをオーバーライドする関数を呼び出そうとしていることを認識できません。一方、次のコードは正常にコンパイルされます。

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%確信が持てません。誰か確認できますか?

4

2 に答える 2

7

この動作は仕様です。

派生クラスの関数は、基底クラスの他のオーバーロードを隠します。

于 2012-05-09T20:09:12.867 に答える
0

これはバグではありません。

C++ では、継承されたオーバーロードを非表示にする (より安全な既定の動作) か、使用可能にするかを選択できます。

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

Base::myFuncまたは、関数呼び出しの時点で構文を使用できます。

D&Eのセクション 17.4.5.3 および 17.5 に、名前空間間の相互作用とオーバーロードのデフォルトの動作に関する説明があります。アプリケーションコードがBaseライブラリクラスであるとします。Derivedライブラリの次のバージョンでは、多くの関数 (myFuncおそらくmyFunc.

于 2012-05-10T05:20:40.000 に答える