如果需要通过基類的指针指向派生类的对象并访问某个与基类同名的成员,那么首先在基类中将这个同名函数声明为什么是虚函数数这样就可以通过基类指针,使属于不同派生类的不同对象产生不同的行为从而实现运行过程的多态。
如果你编写代码的时候并不能确定调用的是基类嘚函数还是哪个派生类的函数时,你可以选择使用什么是虚函数数
即在类的定义中使用virtual
关键字来限定函数成员,不过注意什么是虚函数數声明只能出现在类定义中的函数原型声明中而不能在成员函数实现的时候。
注意为了清楚地提示这是一个什么是虚函数数我在两个派生类中都使用了virtual
关键字。
子类可以重写父类的什么是虚函数数实现子类的特殊化
从上例看出,在fun函数中使用基类类型的指针ptr
可以指向Base1Base2还有Derived的display()
函数成员,使程序更加高效简洁
假设我把其中的virtual都去掉,运行起来就是如下的场景:
因为去掉了virtual
程序根据其是Base1的指针全部调鼡了Base1的display
方法执行。
我来斗胆总结一下:不使用virtual
程序根据引用、指针类型选择方法;使用virtual
,程序根据对象类型来选择方法基类派生类函數名相同功能不同时最好使用virtual
。
有时候基类中的什么是虚函数数是为了派生类中的使用而声明定义的,其在基类中没囿任何意义此类函数我们叫做纯什么是虚函数数。带有纯什么是虚函数数的类称为抽象类
纯什么是虚函数数与一般什么是虚函数数成員的原型书写不同,后面加了“=0”
声明为纯什么是虚函数数之后,基类就可以不再给出函数的实现部分纯什么是虚函数数的函数体就呮能交给派生类来给出了。这一点较于什么是虚函数数更好理解
程序中类Base1,Base2和Derived属于同一个类族抽象类Base1通过纯什么是虚函数数为整个类族提供了通用外部接口。抽象类的Base1类型指针也可以指向任何一个派生类对象在fun
函数中通过基类Base1指针ptr
可访问到ptr
指向的派生类Base2,Derived类对象成员这样就实现了对同一类族的对象进行统一的多态处理。