1

私は基本クラスを持っています例:

class A {
public:
  virtual void methodA(int) {}
  virtual void methodA(int, int, int) {}
};

xcodeはmethodAが隠されているという警告を出します-すべてのsemは私が期待するように機能します(Aから派生したクラスはAポインターを介してアクセスでき、methodAのいずれかを使用できます)。

4

1 に答える 1

6

Aから派生したクラスの1つ(たとえばB)は、のオーバーロードの1つのみをオーバーライドすると思いますmethodA()。この場合、のその他のオーバーロードmethodAはに隠されていBます。例:

class A {
public:
  virtual void methodA(int) {}
  virtual void methodA(int, int, int) {}
};

class B : public A {
public:
  virtual void methodA(int) {}
};

int main()
{
  A a;
  B b;
  A *pa = &b;
  a.methodA(7); //OK
  a.methodA(7, 7, 7); //OK
  pa->methodA(7);  //OK, calls B's implementation
  pa->methodA(7, 7, 7);  //OK, calls A's implementation
  b.methodA(7); //OK
  b.methodA(7, 7, 7);  //compile error - B's methodA only accepts one int, not three.
}

using解決策は、宣言をB次のように追加することです。

class B : public A {
public:
  using A::methodA;  //bring all overloads of methodA into B's scope
  virtual void methodA(int) {}
};
于 2013-03-08T13:52:35.697 に答える