编译时多态(静态多态):函数重载,运算符重载,重定义。
运行时多态(动态多态):虚函数。
在c++中,当通过基类指针(或引用)请求调用虚函数时,c++程序会在运行过程中正确地选择与对象关联的派生类中重定义的虚函数。
虚函数的定义和使用:
virtual double area();
1 , 在派生类中重定义的虚函数函数签名必须与基类完全一致,而关键字virtual可以省略。
2 , 虚函数不能是友元函数或静态成员函数。
3 , 构造函数不能是虚函数,而析构函数可以是虚函数。
4 , 基类的虚函数在派生类中可以不重新定义。若在派生类中没有重新改写基类的虚函数,则调用的仍然是基类的虚函数。
当父类中的一个函数被virtual修饰的时候,会产生虚函数指针,虚函数指针指向虚函数表。
当运用到虚继承的时候,派生类会重写基类的虚函数表,所以父类指针指向子类对象时,指向的是子类的虚函数表,所以调用的函数也是子类的函数,根据此原理实现运行时多态。
虚析构函数:通过父类指针,释放整个子类空间。
通常情况下,我们用父类指针指向子类空间来实现多态,但是当我们释放空间时,父类指针无法调用子类空间的析构函数,导致子类空间没有释放,从而导致子类空间内存泄漏。
所以,就需要用虚析构函数,用虚析构之后,父类指针就可调用子类空间的析构函数。