经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++11新特性之final override标识符
来源:cnblogs  作者:我是团长  时间:2018/12/18 9:39:52  对本文有异议

final:

  final修饰符可用于修饰类,放在类名后面,被final修饰符修饰的类不能被继承。示例代码:

  1. // 正确的示范
  2. #include <iostream>
  3.  
  4. class A
  5. {
  6. public:
  7. void show_a_info()
  8. {
  9. std::cout << "i am class A" << std::endl;
  10. }
  11. };
  12. class B : public A
  13. {
  14. public:
  15. void show_b_info()
  16. {
  17. std::cout << "i am class B" << std::endl;
  18. }
  19. };
  20. int main()
  21. {
  22. B b;
  23. b.show_a_info();
  24. b.show_b_info();
  25. return 0;
  26. }
  27. // 输出:
  28. // i am class A
  29. // i am class B
  1. // 错误的示范
  2. #include <iostream>
  3.  
  4. class A final
  5. {
  6. public:
  7. void show_a_info()
  8. {
  9. std::cout << "i am class A" << std::endl;
  10. }
  11. };
  12. class B : public A
  13. {
  14. public:
  15. void show_b_info()
  16. {
  17. std::cout << "i am class B" << std::endl;
  18. }
  19. };
  20. int main()
  21. {
  22. B b;
  23. b.show_a_info();
  24. b.show_b_info();
  25. return 0;
  26. }
  27. // 编译报错:错误 2 error C3246: “B”: 无法从“A”继承,因为它已被声明为"final"

  final修饰符还可用于修饰类中的成员函数,但是成员函数必须是虚函数,被final修饰符修饰的虚函数在子类中不可以被重写。示例代码如下:

  1. // 正确的示范
  2. #include <iostream>
  3.  
  4. class A
  5. {
  6. public:
  7. virtual void show_info()
  8. {
  9. std::cout << "i am class A" << std::endl;
  10. }
  11. virtual void test_final() final
  12. {
  13. return;
  14. }
  15. };
  16. class B : public A
  17. {
  18. public:
  19. void show_info() // 可以被重写
  20. {
  21. std::cout << "i am class B" << std::endl;
  22. }
  23. void test_final() // 编译报错:A::test_final声明为final的函数无法被B::test_final重写
  24. {
  25. int count = 0;
  26. // do_something()
  27. return;
  28. }
  29. };
  30. int main()
  31. {
  32. A *a_ptr = new B();
  33. a_ptr->show_info();
  34. return 0;
  35. }

 override:

  在C++11之前,在父类中用virtual声明一个虚函数,在子类中进行重写时,可以省略virtual修饰符,但是子类中重写的函数就算省略了virtual修饰符,它依然是个虚函数,当我们阅读代码时,子类中的这个函数由于没有virtual修饰符修饰,我们不去看父类的定义并不会知道在子类中这是一个虚函数,为了解决可读性问题,我们可以在子类中也加上virtual修饰符,但也同样会带来如下代码中的问题:

  1. class A
  2. {
  3. public:
  4. virtual void show_info(int x)
  5. {
  6. std::cout << "i am class A" << std::endl;
  7. }
  8. };
  9. class B : public A
  10. {
  11. public:
  12. virtual void show_info(float x)
  13. {
  14. std::cout << "i am class B" << std::endl;
  15. }
  16. };

  本意是想重写父类中的show_info(int x)函数,但是写成了show_info(float x),这样写就已经不是重写了,而是变成了重载。为了解决可读性及这种重写被不小心写成重载的问题,在C++11中当我们想重写父类的虚函数时,可以在子类中重写的虚函数后面加上override修饰符,这样既标识在子类中这是在重写父类中的虚函数,同时也可以防止重写被误写为重载,因为当子类中对应的函数声明和父类中不一致时,是编译不过的,示例如下:

  1. // 正确的示范
  2. #include <iostream>
  3.  
  4. class A
  5. {
  6. public:
  7. virtual void show_info(int x)
  8. {
  9. std::cout << "i am class A" << std::endl;
  10. }
  11. };
  12. class B : public A
  13. {
  14. public:
  15. //virtual void show_info(float a) override // 错误error C3668: “B::show_info”: 包含重写说明符“override”的方法没有重写任何基类方法
  16. //{
  17. // std::cout << "i am class B" << std::endl;
  18. //}
  19.  
  20. virtual void show_info(int a) override // 正确
  21. {
  22. std::cout << "i am class B" << std::endl;
  23. }
  24. };

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号