虚函数
1 虚函数要解决的问题:
如果一个基类有多个派生类,每个派生类又有各自的派生类,形成了同一基类的类族。在程序中要调用同一类族不同类的同名函数,要定义多个指向不同派生类的指针变量或者定义多个不同派生类型的对象。即在调用同一类族不同类的同名函数的时候采用不同的方法。(类比:到不同的目的地乘坐不同的公交线路,搭乘不同的公交车,一一对应)
没有虚函数之前要调用同一类族不同类的同名函数的方法:
只声明指向基函数的指针,然后分别使指针指向同一类族不同类的同名函数,比较输出结果
输出结果:
还是调用的基类的同名函数,并没有调用派生类的同名函数
如果想要调用同一类族不同类的同名函数,需要定义多个指向不同基类的指针(不同的方式)
2 虚函数要实现的功能:
能否采用同一种调用形式,既能调用基类也能调用派生类中的同名函数
3 虚函数的核心原理:
把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义赋予新的功能。可以通过指向基类的指针指向同一类族不同类的对象,从而调用其中的同名函数。
使用虚函数之后调用同一类族不同类的同名函数的方法:
在声明基类的时候,同名函数前加上“virtual”关键字
定义指向基类的指针,分别将同一类族不同类的对象赋值给指针,调用同名函数,比较输出结果
成功地使用一种方法调用了同一类族不同类的实例对象
总结一下虚函数的使用方法:
①在基类中用virtual声明成员函数为基函数
②在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体
c++规定当一个基类的成员函数被声明为虚函数后,其所有派生类的同名函数都会自动成为虚函数。(所以只需要在基类对成员函数前加virtual,其他不用加是因为会自动默认为虚函数)
③定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象
④通过该指针变量调用此虚函数,此时调用的就是指针变量指向对象的同名函数。
通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。如果指针不断地指向同一类族中不同类的对象,就能不断地调用这些对象中的同名函数。这就如同前面说的,不断地告诉出租车司机要去的目的地,然后司机把你送到你要去的地方。
3 虚函数和多态性
虚函数实现了同一类族的多态性:对同一消息,不同对象有不同的相应方式。
4 虚函数和函数重载
函数重载处理的是同一层次上的同名函数问题,而虚函数处理的是不同派生层次上的同名函数问题,前者是横向重载,后者可以理解为纵向重载。但与重载不同的是:同一类族的虚函数的首部是相同的,而函数重载时函数的首部是不同的(参数个数或类型不同)。