歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 顯式重載虛函數(C++11特性)

顯式重載虛函數(C++11特性)

日期:2017/3/1 10:13:52   编辑:Linux編程

GCC4.7.0已經支持C++11標准的大部分功能了,今天嘗試了下C++11的顯式重載虛函數機制,感覺還是非常靈活的,語法結構如下:

  1. #include <iostream>
  2. class A
  3. {
  4. public:
  5. virtual void fun1()
  6. {
  7. std::cout << "A:1" << std::endl;
  8. };
  9. virtual void fun2()final
  10. {
  11. std::cout << "A:2" << std::endl;
  12. }
  13. virtual void fun3()
  14. {
  15. std::cout << "A:3" << std::endl;
  16. }
  17. void fun4()
  18. {
  19. std::cout << "A:4" << std::endl;
  20. }
  21. virtual void fun5()
  22. {
  23. std::cout << "A:5" << std::endl;
  24. }
  25. };
  26. class B final: public A
  27. {
  28. public:
  29. virtual void fun1()override//(1)
  30. {
  31. std::cout << "B:1" << std::endl;
  32. }
  33. /*virtual void fun2()override//(2)
  34. {
  35. std::cout << "B:2" << std::endl;
  36. }*/
  37. /*virtual void fun2()(3)
  38. {
  39. std::cout << "B:2" << std::endl;
  40. }*/
  41. /*void fun2()(4)
  42. {
  43. std::cout << "B:2" << std::endl;
  44. }*/
  45. virtual void fun3()//(5)
  46. {
  47. std::cout << "B:3" << std::endl;
  48. }
  49. /*virtual void fun4()override//(6)
  50. {
  51. std::cout << "B:4" << std::endl;
  52. }*/
  53. virtual void fun4()//(7)
  54. {
  55. std::cout << "B:4" << std::endl;
  56. }
  57. void fun5()override//(8)
  58. {
  59. std::cout << "B:5" << std::endl;
  60. }
  61. };
  62. int main()
  63. {
  64. std::cout << "A" << std::endl;
  65. A a;
  66. a.fun1();
  67. a.fun2();
  68. a.fun3();
  69. a.fun4();
  70. a.fun5();
  71. std::cout << "B" << std::endl;
  72. B b;
  73. b.fun1();
  74. b.fun2();
  75. b.fun3();
  76. b.fun4();
  77. b.fun5();
  78. std::cout << "A*" << std::endl;
  79. A* p = new B();
  80. p->fun1();
  81. p->fun2();
  82. p->fun3();
  83. p->fun4();
  84. p->fun5();
  85. }
以上是我自己編寫的一個分析例子,下面對各部分進行一下分析:

(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修飾。

(3)一旦一個的類的成員函數被聲明為虛函數,那麼就要麼被重載要麼被禁止重載,永遠無法覆蓋。

Copyright © Linux教程網 All Rights Reserved