在介绍多态之前,先回忆:赋值兼容原则、虚基类、二义性、派生类如何给基类赋值等知识。
在赋值兼容原则中:父类对象的指针赋给基类的指针或者父类的对象赋给基类的引用,可以通过强转基类的指针或者引用变为父类的对象。
1 如果不强转访问函数或者数据时只能访问基类本身的,但是此时基类本身数据或者函数中的值应该是父类给赋予的。总之一句话:在没有虚函数时指针或者引用的向上转型,编译看左边,访问也看左边——这叫重载函数之间的关系。(书中P201的例子)
2 当基类中的函数是虚函数时,只要声明了基类指针,就可以用它指向不同的派生类对象产生不同的函数调用,可见运行时多态应该使用虚函数,并通过基类指针或者引用调用派生类对象的虚函数。注意:虚函数的声明只能出现在类声明时的函数原型中,派生类可以不显示的声明为虚函数,系统自动片时虚函数之间的关系还是重载函数之间的关系,虚函数不能是友函数或者静态函数,必须是成员函数。总之一句话:在有虚函数时指针或者引用的向上转型,编译看左边,访问看右边——这叫虚函数之间的关系。
3 函数纯虚函数的类成为抽象类。设计抽象类的目的就是多态的使用它的成员函数,由此为整个类族规定统一的接口形式。抽象类不能实例化。必须通过继承得到派生类,然后在派生类中定义函数的具体实现代码,再获得派生类的对象。
virtual 类型 函数名(参数列表)=0;
纯虚函数需要在派生类中实现,否则这个派生类依旧是抽象类。
4 虚析构函数
在使用虚函数过程中,如果处理不当析构函数往往不执行或者部分不执行(编程已经测试,情况比较多,这里就不一一列举,总之不像没使用虚函数时一样,没有使用虚函数时,析构函数从基类到派生类全部执行,使用了虚函数往往就不会了),此时如果存在动态内存分配在类中,并且清理工作是在析构函数中,只要将基类的析构函数声明时虚析构函数即可,此时派生类中以及子类中的析构函数也是虚析构函数。