多态:用一个名字定义不同的函数,调用同一个名字的函数,却执行不同的操作。
如何实现绑定方法:
1. 编译时的多态性:通过重载的方法实现。
2. 运行时的多态性: 通过虚函数实现。
C++虚函数的存在主要是为了实现多态的机制。
多态可以理解为用父类指针指向其子类对象,然后通过父类的指针调用实际子类的成员函数。多态可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。
eg://基类:Animal; 必要的前提
virtual void Pet::eating_doing(void) //虚函数
{
std::cout << "pet can eat something and do something!" << std::endl;
}
//子类:Cat; 必要的前提
void Cat::eating_doing(void)
{
std::cout << "Cat can eat fish and play the ball!" << std::endl;
}
正式开始介绍:
Pet *cat = new Cat("cat");
cat->eating();
在不定义虚函数时,指针直接指向Pet,调用的是Pet的eating_doing函数,输出为:pet can eat something and do something!
而定义了虚函数后,cat的指针会转向子类Cat,调用的是Cat的eating_doing函数。输出为:Cat can eat fish and play the ball!
一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于写代码时并不能确定被调用的时基类的函数还是子类的函数,所以被称为 虚函数 。虚函数只能借助指针或引用来达到多态的效果。
虚函数是一种动态的绑定方法,动态绑定和静态绑定看这个博文:https://blog.youkuaiyun.com/iicy266/article/details/11906509
纯虚函数 : 是在定义的虚函数原型之后加上=0;
virtual void play(void)=0; //是一种抽象方法,告诉编译器不用执行这条函数了,在基类中还不能为它提供一个实现
定义纯虚函数时为了实现一个接口,起到一个规范的作用,规范继承了这个类的子类必须实现这个函数。