我试图了解 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 override”,因为我正在传递 Derived::foo 的地址。有人可以解释为什么在这种情况下选择“基础过载”吗?我有兴趣了解导致这种行为的底层 C++ 机制。
仅仅因为
Derived
没有声明自己的foo
,而是从Base
继承它。如果您覆盖(或隐藏)它,类型将更改为 ... (Derived::*)(...)
。
这有时在模板中很有用,可以检测某个函数是否被覆盖。