C ++成员函数虚拟覆盖和重载同时进行

时间:2009-02-25 13:04:55

标签: c++ inheritance polymorphism virtual

如果我有这样的代码:

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,因为这两个函数都被声明为虚函数?


在阅读了jalf的回答后,我进一步减少了它。这个也行不通。不太直观。

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

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


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

  return 0;
}

3 个答案:

答案 0 :(得分:43)

简短的回答是“因为这就是重载解析在C ++中的工作原理”。

编译器在C类中搜索函数F,如果找到任何函数,它将停止搜索,并尝试从中搜索候选者。如果在派生类中没有找到匹配的函数,它只会查看基类内部。

但是,您可以将基类函数显式引入派生类的命名空间:

struct C : public B {
  void f(void*) {}
  using B::f; // Add B's f function to C's namespace, allowing it to participate in overload resolution
};

答案 1 :(得分:-1)

或者你可以这样做:

void main()
{
    A *a = new C();
    a->f(1);  //This will call f(int) from B(Polymorphism)
}

答案 2 :(得分:-6)

嗯,我认为首先你不明白虚拟机制或多态性。当仅通过使用对象指针实现多态性时。我认为你是c ++的新手。在不使用对象指针的情况下,没有多态性或虚拟关键字使用基类指针的含义,并为其分配所需的派生类对象。然后打电话试试。