GCC4.7.0已经支持C++11标准的大部分功能了,今天尝试了下C++11的显式重载虚函数机制,感觉还是非常灵活的,语法结构如下:
#include <iostream> class A { public: virtual void fun1() { std::cout << "A:1" << std::endl; }; virtual void fun2()final { std::cout << "A:2" << std::endl; } virtual void fun3() { std::cout << "A:3" << std::endl; } void fun4() { std::cout << "A:4" << std::endl; } virtual void fun5() { std::cout << "A:5" << std::endl; } }; class B final: public A { public: virtual void fun1()override//(1) { std::cout << "B:1" << std::endl; } /*virtual void fun2()override//(2) { std::cout << "B:2" << std::endl; }*/ /*virtual void fun2()(3) { std::cout << "B:2" << std::endl; }*/ /*void fun2()(4) { std::cout << "B:2" << std::endl; }*/ virtual void fun3()//(5) { std::cout << "B:3" << std::endl; } /*virtual void fun4()override//(6) { std::cout << "B:4" << std::endl; }*/ virtual void fun4()//(7) { std::cout << "B:4" << std::endl; } void fun5()override//(8) { std::cout << "B:5" << std::endl; } }; int main() { std::cout << "A" << std::endl; A a; a.fun1(); a.fun2(); a.fun3(); a.fun4(); a.fun5(); std::cout << "B" << std::endl; B b; b.fun1(); b.fun2(); b.fun3(); b.fun4(); b.fun5(); std::cout << "A*" << std::endl; A* p = new B(); p->fun1(); p->fun2(); p->fun3(); p->fun4(); p->fun5(); }
以上是我自己编写的一个分析例子,下面对各部分进行一下分析:(1)显式重载基类虚函数fun1
(2)显式重载final的基类虚函数,编译错误。final语法禁止派生类重载该虚函数。
(3)隐式重载基类final虚函数,编译错误。
(4)不声明virtual并隐式重载基类final虚函数,编译错误。
(5)隐式重载基类虚函数,跟(1)比较有个缺陷:如果基类中不存在这个虚函数在编译期无法检测到错误
(6)显式重载基类的普通成员函数,override只能重载虚函数,故编译错误。
(7)重新声明fun4函数为虚函数,覆盖基类的fun4而不是重载。
(8)显式重载基类虚函数fun5而不许要明确声明virtual。
综上所述:
(1)在派生类中重载基类虚函数应该显式使用override,避免重载基类中不存在的虚函数,会在编译期检查到错误。
(2)如果想终止基类中的虚函数方法,而在B的类中不被重载需要明确的添加final修饰。