一、多态的概念
面对对象的四个特性分别为抽象、封装、继承、多态。而多态的概念就是:如果子类中的成员函数对父类中的成员进行了覆盖,当一个指向子类的父类指针或引用了子类的父类引用,当使用它调用虚函数,然后根据实际的调用对象调用子类中的覆盖函数,而不是父类中的虚函数,这种语法现象叫多态。
二、多态的作用
同一种类发出同一种调用,而产生不同的反映,也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。主要目的也就是为了接口重用。
三、构成多态的条件
1、多态特性除了父子类之间要构成覆盖,还必须是父类以指针或引用的方式来指向子类。
2、当指针或引用已经构成多态时,此时调用成员所传的this指针再调用成员函数时也可以构造多态。
#include <iostream>using namespace std; class A { protected: int num; public: A() { show(); } virtual A* show(int num=20) { cout << "A:" << num << endl; } ~A() { show(); } }; class B : public A { public: B() { } B* show(int num = 10) { cout << "B:" << num << endl; } ~B() { } }; int main() { B b; }
3、在子类的构造函数执行前会先调用父类的构造函数,如果调用了被覆盖的虚函数,由于子类还没有被构造完成,因此只能是调用父类中的虚函数。
构造函数在进入函数体执行时,类中看得见的资源已经全部构造完成。
4、在子类的析构函数执行完成后会再调用父类的析构函数,如果调用被覆盖的虚函数,由于子类已经析构完成,已经不能算是完整的子类了,因此只能调用父类中的虚函数。
四、C++中的虚函数
成员函数在定义时添加了 virtual 这个关键字的函数就是虚函数。
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”。
成员函数中有纯虚函数的叫抽象类,这种类不能创建对象。
所有的成员函数都是纯虚函数,这种类叫纯抽象类。
纯抽象类可以是类封装的一个过程,同时抽象类也可以当作一个统一的接口类。