class CClassBase { public: virtual bool vFunTest(); bool funTest(); }; class CClassExtern : public CClassBase { public: virtual bool vFunTest (); bool funTest(); };
多态的主要思想:基类指针可以指向派生的对象。
CClassExtern *pE = new CClassExtern(); CClassBase* p = pE; pE-> vFunTest (); //调用派生类方法 p-> vFunTest (); //调用派生类方法 pE->funTest(); //调用派生类方法 p->funTest(); //调用基类方法 fun(CClassBase* pTemp) { pTemp-> vFunTest (); //传入派生类对象时,调用派生类方法;传入基类对象,调用基类方法 pTemp->funTest();//调用基类方法 }
多态---最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。
虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态覆盖(Override)
隐藏---是指派生类的函数屏蔽了与其同名的基类函数。
(规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual
关键字,基类的函数将被隐藏(易与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual
关键字。此时,基类的函数被隐藏(易与重载混淆)。)
重载---则是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,参数类型不同,或者两者都不同。编译器会根据这些函数的参数列表,来实现同名函数调用时的重载问题。