显式重载虚函数(C++11特性)

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修饰。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ef074ce497872f83bbf467ab2288fc8b.html