多态性
多态性是面向对象程序设计的关键技术之一。若程序设计语言不支持多态性,不能称为面向对象的语言。利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能。
虚函数
虚函数是一个类的成员函数,定义格式如下:
virtual 返回类型函数名(参数表)
关键字virtual指明该成员函数为虚函数。virtual仅用于类定义中,如虚函数在类外定义,不可加virtual(但是类内部声明时要加virtual)。
当某一个类的一个类成员函数被定义为虚函数,则由该类派生出来的所有派生类中,该函数始终保持虚函数的特征。
最后一句话如何理解?
#include<iostream> using namespace std; class Base { public: virtual void show() { cout << "This is Base show" << endl; } }; class D :public Base { public: void show() { cout << "This is D show" << endl; } }; class C :public D { public: void show() { cout << "This is C show" << endl; } }; void main() { C c; D *pd = &c; pd->show(); }
倘若D的show不是虚函数,那么pd->show();访问的就是类D的show方法。但结果却是C的show方法,所以类D的show方法也是虚的。
在整个虚函数继承体系中,父类 子类的虚函数需要做到3同。函数名相同,函数返回值相同,函数参数相同(包括参数个数,参数类型)
当在派生类中重新定义虚函数(overriding a virtual function,亦译作重载或覆盖)时,不必加关键字virtual。但重新定义时不仅要同名,而且它的参数表和返回类型全部与基类中的虚函数一样,否则联编时出错。
同名覆盖(override):如未关键字virtual,则是普通的派生类中的新成员函数覆盖基类同名成员函数(当然参数表必须一样,否则是重载),可称为同名覆盖函数,它不能实现运行时的多态性。
实现多态
继承
虚函数
通过父类指针 或 引用