纯虚函数
- 纯虚函数形为
virtual void run() = 0;
- 纯虚函数在基类中是一定没有定义的 只会在基类中声明,并且要求子类一定要重写该函数不然会报错。(类似于java中的接口 ,当具体继承时要求重写所有接口中的方法)
- 纯虚函数目的是为了实现“运行时多态“,实现同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
- "运行时多态"是指一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被称为“虚”函数
- 一个类,只要有纯虚函数就称为抽象类,一个抽象类只能作为基类,而且不能定义抽象类的对象,但是可以定义抽象类的指针,为的是,他可以指向派生类的对象实现多态。
虚函数
- 虚函数形为
virtual void say() ;
- 虚函数也是为了实现“运行时多态”
区别
- 对于虚函数来说,基类可以有定义,子类可以没有定义,也就是可以不重载。
- 对于纯虚函数来说,基类必须无定义,子类必须有定义,也就是子类中必须重载。
多态例子
下面是一个经典的使用“动态绑定/运行多态”的例子
//头文件
#include<iostream >
using namespace std;
class Animal
{
private:
int height;
public:
virtual void say() //虚函数在基类中可以有定义
{
cout << "i am animal"<<endl;
}
virtual void run() = 0; //纯虚函数在基类中无定义
};
class Cat :public Animal
{
private:
int color;
public:
void say() //重写虚函数
{
cout << "i am a cat"<<endl;
}
void run() //必须重写纯虚函数
{
cout << "cat run" << endl;
}
};
class Dog :public Animal
{
private:
int weight;
public:
void say()
{
cout << "i am a dog" << endl;
}
void run()
{
cout << "dog run" << endl;
}
};
class Person :public Animal
{
private:
int id;
public:
void run() //可以不重载 虚函数 但是必须重载 纯虚函数
{
cout << "person run" << endl;
}
};
//cpp
#include"标头.h"
#include<list>
int main()
{
//Animal a;
list<Animal *>animals;
Animal *a = new Dog();
Animal *b = new Cat();
Animal *c = new Person();
animals.push_back(a);
animals.push_back(b);
animals.push_back(c);
for (auto i : animals)
{
i->say();
}
for (auto i : animals)
{
i->run();
}
//虚函数
//i am a dog //执行子类方法
//i am a cat //执行子类方法
//i am animal //找不到子类方法后 执行父类方法
//纯虚函数全部执行子类方法
//dog run
//cat run
//person run
return 0;
}
参考资料:
虚函数和纯虚函数的区别
https://blog.csdn.net/wang13342322203/article/details/80512330
https://blog.csdn.net/qq_37699336/article/details/78524890