虚函数:虚函数是动态绑定的基础。虚函数必须是非静态的成员函数,虚函数经过派生后在类族中就可以实现运行过程中的多态。
根据类型兼容原则,可以使用派生类的对象代替基类对象。如果用基类类型的指针指向派生类对象,就可以通过这个指针来访问该对象,问题是访问到的只是从基类中继承来的同名函数。解决办法:若需要通过基类指针指向派生类对象,并且访问某个与基类同名的成员,首先在基类中将该同名函数声明为虚函数。如此,通过基类类型的指针,就可使属于不同派生类的不同对象产生的不同的行为,从而实现运行过程的多态。
虚函数在类的定义中使用virtual关键字来限定成员函数。注:虚函数声明只能出现在类定义中的函数原型声明中,而不能在成员函数实现的时候。
运行时多态需满足三个条件:1、类之间满足类型兼容原则。2、要声明虚函数。3、由成员函数来调用或通过指针、引用来访问虚函数。
#include <iostream> using namespace std; class B0 { public: virtual void display(){cout << "B0::display()" <<endl;} }; class B1:public B0 { public: void display(){cout << "B1::display()" <<endl;} }; class D1:public B1 { public: void display(){cout << "D1::display()" <<endl;} }; void fun(B0 *ptr) { ptr->display(); } int main() { B0 b0,*p; B1 b1; D1 d1; p = &b0; fun(p); p = &b1; fun(p); p = &d1; fun(p); }
Note:在重写继承来的虚函数时,如果函数由默认参数值,不可重新定义不同的值。原因:虽然虚函数是动态绑定的,但默认形参值是静态绑定的。也即,通过一个指向派生类对象的基类指针,可以访问到派生类的虚函数,但默认形参值却只能来自基类的定义。