虚函数

看下面这段代码:

#include <iostream>

using namespace std;

class Entity{
public:
    void getName(){
        cout << "Entity" << endl;
    }
};

class Player: public Entity{
private:
    string name;
public:
    Player(string t_name){
        name = t_name;
    }
    void getName(){
        cout << name << endl;
    }
};

int main()
{
    Entity *e = new Entity();
    Player *p = new Player("蔡旭村");
    p->getName(); // 正常,调用了Player重写的getName
    e->getName(); // 正常,调用了Entity的getName
    Entity *ep = p;
    // 出现异常,这里e指向p,p是Player,但是调用了Entity的getName(因为e指针是Entity的指针)
    ep->getName();
    // 这里我希望他调用到正确的函数(Player的getName(),需要使用虚函数)
    return 0;
}

Entity指针指向它的派生类Player的指针。此时调用成员方法调用的是Entity的,但是我们这里需要调用的是Player的成员方法。需要用到虚函数,程序修改后如下:

(注意 override 是C++ 11后才有的,可以不写)

#include <iostream>

using namespace std;

class Entity{
public:
    virtual void getName(){
        cout << "Entity" << endl;
    }
};

class Player: public Entity{
private:
    string name;
public:
    Player(string t_name){
        name = t_name;
    }
    void getName () override{
        cout << name << endl;
    }
};

int main()
{
    Entity *e = new Entity();
    Player *p = new Player("蔡旭村");
    p->getName(); // 正常,调用了Player重写的getName
    e->getName(); // 正常,调用了Entity的getName
    Entity *ep = p;
    ep->getName(); // 正常,调用了Player重写的getName
    return 0;
}
最后修改:2023 年 04 月 28 日
如果觉得我的文章对你有用,请随意赞赏