为什么C++在使用派生类成员函数指针时选择基类重载?

问题描述 投票:0回答:1

我试图了解 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++ 机制。

c++ virtual-functions overload-resolution
1个回答
0
投票

仅仅因为

Derived
没有声明自己的
foo
,而是从
Base
继承它。如果您覆盖(或隐藏)它,类型将更改为
... (Derived::*)(...)

这有时在模板中很有用,可以检测某个函数是否被覆盖。

© www.soinside.com 2019 - 2024. All rights reserved.