1

同じ名前の 2 つの関数を含む基本クラスがあります。1 つvector<int>はパラメーターとして で、もう 1 つはintです。子クラスは int を処理する独自のメソッドを定義し、基本クラスはどちらのオプションも処理できるようにするという考え方です。しかし、現時点ではコンパイルされません。

class base {
public:
  virtual void toBeCalled(int i) const = 0;

  virtual void toBeCalled(std::vector<int> iVec) const
  {
    std::cout << "base::toBeCalled(vec<int>)" << std::endl;
  }
};  

class derived : public base {
public:
  virtual void toBeCalled(int i) const
  {
    std::cout << "derived::toBeCalled(int)" << std::endl;
  }
};

int main(int argc, char* argv[])
{
  derived d;
  std::vector<int> iVec;

  int i = 0;

  d.toBeCalled (i);
  d.toBeCalled (iVec);  //<< Compile error: Cannot convert from std::vector<int> to int

  return 0;
}

main() で基本クラス オブジェクトを使用して動作させることはできますbase *d = new derived()が、派生クラス関数の一部にアクセスしたいので、可能であればこれを行いたくありません。

4

4 に答える 4

5

入れusing base::toBeCalled;ますclass derived

これはだましだと確信していますが、見つけることができないので、詳しくは説明しません。ただし、派生クラスの関数をオーバーライド (またはオーバーロード) すると、その関数の基底クラス バージョンがすべて非表示になります。

動作の根拠については、https ://stackoverflow.com/a/12036004/13005 で説明しています。

于 2013-03-07T11:14:35.437 に答える
3

あなたはclass derivedベースから派生したものではありません。

class derived: public base {
于 2013-03-07T11:15:05.077 に答える
2

ここにコードをコピーするときに、基本クラスを指定するのを忘れたと思います。これは、代わりに:

class derived {
public: // and so on

あなたが持っている:

class derived : public base {
public: // and so on

クラスのメソッドを定義すると、これらのメソッドは基本クラスで同じ名前のメソッドを非表示にします。この場合、メソッドをオーバーライドするtoBeCalled()と、クラスderivedには指定したシグネチャのみが含まれることになります。基本クラスの他の署名は非表示になります。

class derived : public base {
public:
  virtual void toBeCalled(int i) const
  {
    std::cout << "derived::toBeCalled(int)" << std::endl;
  }
  // void base::toBeCalled(std::vector<int> iVec) const is hidden and
  // cannot be accessed through this class
};

派生クラスのメソッドの2番目のバージョンをオーバーライドしたくないので、メソッドのすべての基本クラスバージョンを派生クラスにインポートする(非表示にするのではなく)ことをコンパイラーに明示的に通知するのが最善の方法です。クラス。これは、using句を介して行われます。

class derived : public base {
public:
  using base::toBeCalled; // Any version of method toBeCalled() not overriden here
                          // will now be taken from the base class
  virtual void toBeCalled(int i) const
  {
    std::cout << "derived::toBeCalled(int)" << std::endl;
  }
  // void base::toBeCalled(std::vector<int> iVec) const is taken
  // from the base class now
};
于 2013-03-07T11:27:18.987 に答える
0

あなたはこのようなものでそれを呼び出すことができます、

  base.toBeCalled(iVec);  // here base is not base class name...it is reference to Parent Class 

他の方法 -

class derived : base  {  // inherit base class
public:
  virtual void toBeCalled(int i) const
  {
    std::cout << "derived::toBeCalled(int)" << std::endl;
  }
};
于 2013-03-07T11:17:06.690 に答える