目录
——virtual 修饰的函数是虚函数,表示可以被重写
——virtual 只能在函数内部声明或定义,不能出现在类的外部
——override 后缀,可以强制检测函数是重载
——final 后缀,终止函数的重载
——类对象无法调用虚函数,必须使用类指针
——虚函数在子类和父类中必须拥有相同的参数列表和返回值(指针除外)
——虚函数不能是函数模板
- #include
-
- using namespace std;
- //virtual 虚函数
- //override 可以强制要求检测函数是重载
- //final 可以终止函数的重载
- class MoveObject
- {
- public :
- virtual void Move()
- {
- cout << "我是基类" << endl;
- }
- };
-
- class NPCObject : public MoveObject
- {
- public :
- void Move() override
- {
- cout << "我是NPC" << endl;
- }
- };
-
- class MonsterObject : public MoveObject
- {
- public:
- void Move() override
- {
- cout << "我是怪物" << endl;
- }
- };
-
- void Move(MoveObject *obj)
- {
- obj->Move();
- }
-
- int main()
- {
- MonsterObject snake;
- NPCObject npc;
- Move(&snake);
- Move(&npc);
-
- system("pause");
- return 0;
- }
虚函数表——每个包含了虚函数的类都包含一个虚表。 x86下为4字节,指向虚函数表的地址,虚函数表的地址记录了该类重写的虚函数地址。x64下为8字节。
语法:virtual 返回值类型 函数名(参数列表)=0,当类中有了纯虚函数,这个类也称抽象类。
抽象类特点: 无法实例化对象,子类必须重写抽象类中的纯虚函数,否则也属于抽象类。