虚函数

时间:2020-04-11
本文章向大家介绍虚函数,主要包括虚函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

虚函数允许我们在子类中将方法进行重写,假如有AB两个类,B是A的子类,如果我们在A中建立一个方法并将其标记为虚函数,那么我们将可以在B类中对其进行改写以完成其他的功能

#include<iostream>
#include<string>

class Entity
{
public:
    std::string GetName() { return "Emtity"; }
};

class Player :public Entity
{
private:
    std::string m_Name;
public:
    Player(const std::string& name)
        :m_Name(name) {};
    std::string GetName() { return m_Name; }
};

int main()
{
    Entity* e = new Entity();
    std::cout << e->GetName() << std::endl;

    Player* p = new Player("Wang TN");
    std::cout << p->GetName() << std::endl;

    std::cin.get();
}

 在主函数中加上一个新的Entity,然后令它指向子类,打印出来结果如下

 加上一个在全局中加上一个print函数,函数的输入为Entity类型

#include<iostream>
#include<string>

class Entity
{
public:
    std::string GetName() { return "Emtity"; }
};

class Player :public Entity
{
private:
    std::string m_Name;
public:
    Player(const std::string& name)
        :m_Name(name) {};
    std::string GetName() { return m_Name; }
};

void Print(Entity* e)
{
    std::cout << e->GetName() << std::endl;
}
int main()
{
    Entity* e = new Entity();
    Print(e);

    Player* p = new Player("Wang TN");
    Print(p);
    
    std::cin.get();
}

以看到打印的结果两个都是Entity

 如果我们想要打印出player的GetName,此时就需要虚函数,虚函数也是一种动态调度,如果需要写虚函数,那么要将basic class的basic function设为虚函数。

此时程序结果如下,注意override复写的函数必须和前面的虚函数同名,否则将会出错,复写不是虚函数的父类函数也会出错

原文地址:https://www.cnblogs.com/wangtianning1223/p/12680648.html