首先来看一下一个继承
Brass类在声明ViewAcct()和Withdraw()时使用了virtual,这有什么用呢?
如果方法是通过引用或指针而不是对象调用的,它将确定使用哪一种方法,我们知道在类的继承中,基类指针可以在不进行显式类型转换情况下指向派生类对象;基类引用可以在不进行显式类型转换的情况引用派生类对象。如果没有使用virtual关键字,程序将根据引用类型或指针类型选择方法;如果使用了virtual,程序将根据引用或指针指向的对象的类型来选择方法。如果ViewAcct不是虚拟的,则程序的行为如下:
引用变量类型为:Brass,所以选择了Brass::ViewAccount()。使用Brass指针代替引用时,行为与之类似。
如果ViewAcct()是虚拟的,则行为如下:
这里两个引用的类型都是Brass,但b2_ref引用的是一个BrassPlus对象,所以使用的是BrassPlus::ViewAcct()。使用Brass指针代替引用时,行为将类似。
方法在基类中被声明为虚拟的后,它在派生类中将自动成为虚方法。不过,在派生类声明中使用关键字virtual来指明哪些函数是虚函数也不失为一个好方法。
基类声明了一个虚拟析构函数。这样做是为了确保释放派生对象时,按正确的顺序调用析构函数。