1

次のコードの何が問題になっていますか?

struct A {
  virtual int hash() const = 0;
  virtual int hash(int x) const = 0;
};

struct B : public A {
  int hash() const final {
    return 10;
  };

  int hash(int x) const override {
    return 10;
  };
};

struct C : public B {
  int hash(int x) const override {
    return x;
  }
};

#include <iostream>

int main() {
  C a;
  std::cout << a.hash() << std::endl;
  std::cout << a.hash(20) << std::endl;
  return 0;
}

次のエラーメッセージでコンパイルエラーが発生しました

xx.cc:26:23: error: too few arguments to function call, single argument 'x' was
      not specified
  std::cout << a.hash() << std::endl;
               ~~~~~~ ^
xx.cc:17:3: note: 'hash' declared here
  int hash(int x) const override {
  ^
1 error generated.
4

2 に答える 2

2

これは名前の隠蔽の問題です。名前検索のルールによると、

(私のものを強調)

名前ルックアップは、以下に説明するようにスコープを調べます。何らかの種類の宣言が少なくとも 1 つ見つかるまで、その時点でルックアップは停止し、それ以上のスコープは調べられません

したがってC::hash、基本クラスから名前を隠します。

名前をクラススコープusingに導入することを申請できます。C

struct C : public B {
  using B::hash;
  int hash(int x) const override {
    return x;
  }
};
于 2019-11-14T03:36:22.473 に答える
1

ええ、派生クラス内でオーバーロードを再定義する必要があります。

struct C : public B {
  int hash(int x) const override {
    return x;
  }
  int hash() const override {
    return B::hash();
  }
};

または、代わりに B への参照を介して呼び出します

int main() {
  C a;
  B& b = a;
  std::cout << b.hash() << std::endl;
  std::cout << b.hash(20) << std::endl;
  return 0;
}
于 2019-11-14T03:35:45.753 に答える