c++ - 多态性和成员函数指针是如何工作的?

标签 c++ polymorphism

<分区>

我有以下代码:

#include <iostream>
using namespace std;

class Base 
{
public:
    virtual void WhoAmI() const;
    typedef void (Base::*WhoPtr)() const;
};

class Derived : public Base 
{
public:
    virtual void WhoAmI() const;
};

void Derived::WhoAmI() const 
{
    cout << "I am the derived" << endl;
}

void Base::WhoAmI() const 
{
    cout << "I am the base" << endl;
}

int main() 
{
    Base::WhoPtr func = &Base::WhoAmI;
    Base theBase;
    (theBase.*func)();
    Derived theDerived;
    (theDerived.*func)();
    cin.get();
    return 0;
}   

让我们关注主要内容:

int main() 
{
    Base::WhoPtr func = &Base::WhoAmI;
    Base theBase;
    (theBase.*func)();
    Derived theDerived;
    (theDerived.*func)();
    cin.get();
    return 0;
}   

我们有一个局部变量func,它保存着Base::WhoAmI的地址。

此外,我们还有 BaseDerived 对象。

在第 2 行,我们从基调用指向的 func:(theBase.*func)()

我到现在才明白。

2 行之后,我们从派生调用它:(theDerived.*func)()

它打印:I am the derived。为什么?

WhoAmI 都是虚拟的,这意味着调用依赖于指向的对象,而不是类型。

指向的对象是属于Basefunc。为什么打印I am the derived而不是I am the base

最佳答案

你为什么惊讶。你有一个指向成员函数的指针 指向一个虚拟函数。如果你把地址 theDerived,或对它的引用,并初始化一个 Base* 或 一个 Base& ,你会期望 ptrToBase->WhoAmI() 调用 派生类中的函数。毕竟,这就是你使用的原因 一个虚函数开始。当你 通过指向成员函数的指针调用。表达方式 &Base::WhoAmI 生成指向(虚拟)成员函数的指针。

关于c++ - 多态性和成员函数指针是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17910542/

相关文章:

c++ - 如何在c++代码中生成生成粒子的总动能和总势能?

c++ - 如何将图书馆整合到我的图书馆

c++ - telnet LINEMODE 子选项 TRAPSIG 不起作用

java - 为什么叫运行时多态呢?

c# - 在 C#/Linq 中搜索子类型的集合

具有多种类型支持的 Java 泛型

c++ - 访问/填充来自不同类的 vector ?

C++链接不同目录中的第3方dll

java - 为什么字段从父类打印,而方法从子类打印(Java)

ruby-on-rails - 使用它的多个属性的 Rails 多态关联