web-dev-qa-db-ja.com

派生クラスの基本クラスメソッドのオーバーロード

次のコードがコンパイルされない理由を理解しようとしています。明らかに、解決策は、派生クラスのmethod_Aへの依存関係を特に宣言することに依存しています。次のコードを参照してください。

class Base
{
  public:

    void method_A(int param, int param2)
    {
      std::cout << "Base call A" << std::endl;
    }

};

//does not compile
class Derived : public Base
{
  public:

    void method_A(int param)
    {
      std::cout << "Derived call A" << std::endl;
    }
};

//compiles
class Derived2 : public Base
{
  public:
    using Base::method_A; //compile
    void method_A(int param)
    {
      std::cout << "Derived call A" << std::endl;
    }
};

int main ()
{
  Derived myDerived;
  myDerived.method_A(1);
  myDerived.method_A(1,2);

  Derived2 myDerived2;
  myDerived2.method_A(1);
  myDerived2.method_A(1,2);
  return 0;
}

"test.cpp"、(S) "Derived :: method_A(int)"に間違った数の引数が指定されました。

派生クラスがその基本クラスがオーバーロードしようとしているメソッドを実装していることを知ることを妨げる技術的な理由は何ですか?この場合にコンパイラ/リンカーがどのように動作するかをよりよく理解したいと思っています。

22
dau_sama

Name Hiding。 Baseメソッドと同じ名前の非仮想メソッドを定義すると、DerivedクラスのBaseクラスメソッドが非表示になるため、

 myDerived.method_A(1,2);

ベースの非表示 Derivedクラスのクラスメソッドを回避するには、Derived2クラスの場合と同様にキーワードを使用します。

また、それを機能させたい場合は、明示的に行うことができます

myDerived.Base::method_A(1,2);

this を参照してください。名前の非表示が明らかになった理由を詳しく説明しています。

36
Daemon

さて、あなたが呼んでいる人のために

 myDerived.method_A(1,2);

引数が2つの場合、ベースと派生の両方でメソッドは1つの引数のみをとるように宣言されます。

Method_Aは仮想ではないため、セコドリーでは、何もオーバーライドしていません。あなたは過負荷です。

0
Armen Tsirunyan