c++ - C++ 中的函数指针和重写函数

标签 c++

我是 C++ 的新手,现在对多态性概念和函数指针感到困惑。我脑子里有点困惑。

在下面截取的代码中,我声明了一个指向 BaseClass 中方法的函数指针。然后我给它分配了 &BaseClass::Print

最后两行是我感到困惑的部分:为什么这两行不会产生相同的结果?我猜这是因为指针 myPtr 指向 v 表,但我不确定。另外,如果我想让 myPtr 调用重写的 BaseClass::Print() 函数,我该怎么做?

谁能向我澄清一下?谢谢。

#include <iostream>
using namespace std;

class BaseClass{
    public:
        virtual void Print(){
            cout << "Hey!" << endl;
        }
};

class DerivedClass : public BaseClass
{
    public:
        void Print(){
            cout << "Derived!" << endl;
        } 
};

int main()
{
    BaseClass *b = new DerivedClass;

    void (BaseClass::*myPtr)();

    myPtr = &BaseClass::Print;

    (b->*myPtr)(); //print "Derived!"
    b->BaseClass::Print(); //print "Hey!"
}

最佳答案

(b->*myPtr)(); 调用 bBaseClass::Print 成员。 BaseClass::Print 是一个虚函数,由于您是通过指针类型调用它,因此将以多态方式进行查找。也就是说,将根据 b 的动态类型(即 DerivedClass)找到正确的函数。

第二行 b->BaseClass::Print(); 显式调用 Print 成员函数,它是 BaseClass 的成员。这正是此语法的用途。它说“嘿,我不在乎 b 的动态类型是什么 - 我希望你调用 BaseClass 版本。”

关于c++ - C++ 中的函数指针和重写函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946455/

相关文章:

c++ - 如何使用 nlohmann::json 将 json 对象转换为 map ?

c++ - 我的程序无法在某些 PC 上运行

C++ 算术与指针

c++ - `std::lock_guard<std::mutex>` 对象没有名称时的不同行为

c++ - 我应该如何将数据类链接到我的 GUI 代码(以在 C++ 中显示对象的属性)?

c++ - 在 C++11 中使用右值引用

c++ - Maya 和 Cuda 11 类型重新声明错误

c++ - `reverse_iterator`的限制原因

c++ - 当参数是指向数组的取消引用的指针时,为什么 `sizeof()`无法按预期工作?

c++ - 传递对可变参数模板的引用使用 std::reference-wrapper