如果一个成员函数函数不声明为virtual的,那么它将根据指针或者引用的类型来调用,否则,它将根据指针或者引用所指的对象类型来调用。
我们可以做一下对比:
现在去掉virtual试试。
现在子类中保留virtual,父类不保留试试。
由此可见这不能实现多态,而且我还发现我的程序不能正常退出,必须强制退出。
现在父类保留virtual,子类不保留,再试试。
所以由此可见,只要是指针或者引用类型中函数是virtual的就可以实现多态了。
事实上只要父类的函数是virtual的,子类中的这个函数也就自动是virtual的,所以最后一种情况和第一种情况是等效的,不过为了提醒程序员,一般的写法就是都加上virtual关键字修饰。
父类的析构函数也要声明成virtual的不仅仅是出于防止资源泄露的考虑,而且是因为这可以实现对象在销毁时调用正确的析构函数和调用析构函数的顺序来析构子类对象的父子成分,因为析构函数也遵循多态机制。