30

次のようなコードがある場合:

struct A {
  virtual void f(int) {}
  virtual void f(void*) {}
};

struct B : public A {
  void f(int) {}
};

struct C : public B {
  void f(void*) {}
};


int main() {
  C c;
  c.f(1);

  return 0;
}

int から void* への無効な変換を行おうとしているというエラーが表示されます。両方の関数が仮想として宣言されているため、コンパイラは B::f を呼び出さなければならないことを理解できないのはなぜですか?


ジャルフの答えを読んだ後、私はそれをさらに減らしました。これもうまくいきません。あまり直感的ではありません。

struct A {
  virtual void f(int) {}
};

struct B : public A {
  void f(void*) {}
};


int main() {
  B b;
  b.f(1);

  return 0;
}
4

3 に答える 3

-1

または、次のようにすることもできます。

void main()
{
    A *a = new C();
    a->f(1);  //This will call f(int) from B(Polymorphism)
}
于 2014-04-01T21:21:56.987 に答える
-6

まず第一に、仮想メカニズムまたはポリモヒズムが何であるかを理解していないと思います。オブジェクト ポインタのみを使用してポリモーフィズムを実現する場合。あなたはC ++が初めてだと思います。オブジェクト ポインターを使用しないと、ポリモーフィズムの意味がないか、仮想キーワードを使用して基本クラス ポインターを使用し、目的の派生クラス オブジェクトをそれに割り当てます。それから電話して試してみてください。

于 2009-10-22T06:19:54.297 に答える