1. C++ 多态Virtual
在基类中声明一个函数为虚函数,使用关键字virtual。
- 派生类可以重写(override)这个虚函数。
- 调用虚函数时,会根据对象的实际类型来决定调用哪个版本的函数。
2. 虚构函数Virtual定义
- 虚构函数
- 纯虚构函数
- 非虚构函数
class Base {
public:
virtual void func1(); // 虚函数
virtual void func2() = 0; // 纯虚函数
void func3(); // 非虚函数
};
2. 举例
- 基类 Aminal.h
- 子类 Dog.h
- Dog.cpp 实现类
2.1 Aminal.h
#ifndef AMINAL_H
#define AMINAL_H
#include <iostream>
using namespace std;
class Aminal {
protected:
int count;
public:
Aminal(){
cout<<"---Aminal---构造函数-----"<<endl;
};
~Aminal(){
cout<<"---Aminal---析构函数-----"<<endl;
};
virtual int getCount() = 0;
virtual int getNumt(){
return 0;
};
};
#endif
2.2 Dog.h
#ifndef DOG_H
#define DOG_H
#include "Aminal.h"
class Dog : public Aminal {
public:
Dog();
~Dog();
int getCount();
int getNum();
};
#endif
2.3 Dog.cpp
#include <iostream>
#include "Dog.h"
using namespace std;
Dog::Dog()
{
cout<<"----Dog---构造函数-----"<<endl;
}
Dog::~Dog()
{
cout<<"----Dog--析构函数-----"<<endl;
}
int Dog::getCount(){
count = 101; // 初始化基类的 count
return count;
};
int Dog::getNum(){
count = 101; // 初始化基类的 count
return count;
};
3. 知识点
- virtual 虚拟函数关键字。
- 若是基类中定义了纯虚构函数,那么基类无需实现,子类必须实现。
- 若是基类中定义了 虚构函数,那么基类必须实现,子类实现-可选。
- 若是基类中定义了 非虚构函数,那么基类实现-可选,子类实现-可选。
- override 虚拟函数关键字。
- 子类使用override 关键字,基类必须使用virtual。
- 子类没使用override关键字,基类使用virtual-可选。
- 子类使用override关键字,是为了校验与重写函数是否有问题。