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

标签 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;
}

最佳答案

简短的回答是“因为这就是 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
};

关于C++成员函数虚覆盖和同时重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/585913/

相关文章:

c# - 通用接口(interface)继承(设计问题)

python - 为什么覆盖我的方法会导致我的属性停止正常工作?

c++ - 并行线程同步

C++ 通过引用返回本地对象

Javascript 继承并丢失 'this' 的上下文

c++ - C++ 中的动态与静态多态性 : which is preferable?

java - 为什么 "synchronized"对多态没有作用

c++ - 为什么在指定 -rdc=true 时 cuda 代码运行得更慢

c++ - 电源故障后 Windows 操作系统中的文件损坏

.NET:继承修改基类(C++转换)