虚函数
虚函数允许我们在子类中将方法进行重写,假如有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复写的函数必须和前面的虚函数同名,否则将会出错,复写不是虚函数的父类函数也会出错
无情的摸鱼机器