多态
多态含义
不同的对象收到相同的消息做出了不同的反应,比如让动物叫,小猫发出喵喵,小狗发出汪汪。
多态性的实现和联编有关。其中在运行之前就完成的联编称为静态联编,而在程序运行时才完成的联编叫动态联编。
静态联编是系统在编译时就决定如何实现某一动作,效率高,但是要求编译时就知道函数的全部信息,并且不够灵活。而动态联编是系统在运行时动态实现某一动作,更灵活。
静态多态性是通过函数重载和模板实现的。
动态多态性是通过虚函数来实现的。
虚函数
虚函数是函数重载的另一种表现形式。
为什么需要引入虚函数?
基类的对象指针可以指向它的公有派生的对象,但是当它指向公有派生对象时,它只能访问派生类中从基类继承来的成员,而不能访问公有派生类中定义的成员。
如果在基类中定义了虚函数,virtual会指示编译器,在运行时确定所要调用的函数。
虚函数与重载函数的关系:
虚函数是函数重载的另一种形式:在派生类中重新定义基类的虚函数。
普通函数重载时,要求函数的参数或者参数类型必须有所不同,函数的返回类型可以不同;但是重载一个虚函数时候,要求函数名、返回类型、参数个数、参数的类型和顺序与基类中的虚函数原型完全相同。
纯虚函数和抽象类
在基类中说明的一个虚函数,在基类中没有具体的定义,没有函数体,但要求在它的派生类中根据需要对它进行定义。
一个类中有一个虚函数,那么称这个类为抽象类,只能作为其他类的基类,不能建立抽象类对象。
虚基类
一个类有多个直接基类,这些直接基类有一个共同的基类,某个成员通过多条派生类继承时,希望只产生一个派生类。
虚基类可以解决二义性的问题