Virtual Method

如果一个成员函数函数不声明为virtual的,那么它将根据指针或者引用的类型来调用,否则,它将根据指针或者引用所指的对象类型来调用。

我们可以做一下对比:

Virtual Method_第1张图片

Virtual Method_第2张图片

现在去掉virtual试试。

Virtual Method_第3张图片

现在子类中保留virtual,父类不保留试试。

Virtual Method_第4张图片
Virtual Method_第5张图片

由此可见这不能实现多态,而且我还发现我的程序不能正常退出,必须强制退出。

现在父类保留virtual,子类不保留,再试试。

Virtual Method_第6张图片
Virtual Method_第7张图片

所以由此可见,只要是指针或者引用类型中函数是virtual的就可以实现多态了。

事实上只要父类的函数是virtual的,子类中的这个函数也就自动是virtual的,所以最后一种情况和第一种情况是等效的,不过为了提醒程序员,一般的写法就是都加上virtual关键字修饰。

父类的析构函数也要声明成virtual的不仅仅是出于防止资源泄露的考虑,而且是因为这可以实现对象在销毁时调用正确的析构函数和调用析构函数的顺序来析构子类对象的父子成分,因为析构函数也遵循多态机制。

你可能感兴趣的:(Virtual Method)