我试图理解 C++ 如何在继承上下文中处理成员函数指针和重载解析。我有一个带有纯虚函数的基类和一个派生类。我重载了一个函数 doSomething 来接受来自基类和派生类的成员函数指针。以下是代码:
#include <iostream>
class Base {
public:
virtual void foo() = 0;
};
class Derived: public Base {};
void doSomething(void (Base::*func)(void)) {
std::cout << "Base overload\n";
}
void doSomething(void (Derived::*func)(void)) {
std::cout << "Derived overload\n";
}
int main(void) {
doSomething(&Derived::foo);
}
当我运行此代码时,输出是:
Base overload
我期望调用“Derived 重载”,因为我传递的是 Derived::foo 的地址。有人能解释一下为什么在这种情况下选择“Base 重载”吗?我有兴趣了解导致这种行为的底层 C++ 机制。
原因很简单,因为
Derived
没有声明自己的foo
,而是从 继承而来Base
。如果你覆盖(或隐藏)它,类型将更改为... (Derived::*)(...)
。这有时在模板中很有用,可以检测某个函数是否被覆盖。
的价值
是
true
,因为您的Dereived
不提供其自己的void foo
覆盖。因此,被选中。如果您将其void doSomething(void (Base::*foo)(void))
添加到 ,它将发生变化。void foo() override;
Derived