C++11新特性之final override标识符
2018-12-19 01:43:39来源:博客园 阅读 ()
final:
final修饰符可用于修饰类,放在类名后面,被final修饰符修饰的类不能被继承。示例代码:
// 正确的示范 #include <iostream> class A { public: void show_a_info() { std::cout << "i am class A" << std::endl; } }; class B : public A { public: void show_b_info() { std::cout << "i am class B" << std::endl; } }; int main() { B b; b.show_a_info(); b.show_b_info(); return 0; } // 输出: // i am class A // i am class B
// 错误的示范 #include <iostream> class A final { public: void show_a_info() { std::cout << "i am class A" << std::endl; } }; class B : public A { public: void show_b_info() { std::cout << "i am class B" << std::endl; } }; int main() { B b; b.show_a_info(); b.show_b_info(); return 0; } // 编译报错:错误 2 error C3246: “B”: 无法从“A”继承,因为它已被声明为"final"
final修饰符还可用于修饰类中的成员函数,但是成员函数必须是虚函数,被final修饰符修饰的虚函数在子类中不可以被重写。示例代码如下:
// 正确的示范 #include <iostream> class A { public: virtual void show_info() { std::cout << "i am class A" << std::endl; } virtual void test_final() final { return; } }; class B : public A { public: void show_info() // 可以被重写 { std::cout << "i am class B" << std::endl; } void test_final() // 编译报错:A::test_final声明为final的函数无法被B::test_final重写 { int count = 0; // do_something() return; } }; int main() { A *a_ptr = new B(); a_ptr->show_info(); return 0; }
override:
在C++11之前,在父类中用virtual声明一个虚函数,在子类中进行重写时,可以省略virtual修饰符,但是子类中重写的函数就算省略了virtual修饰符,它依然是个虚函数,当我们阅读代码时,子类中的这个函数由于没有virtual修饰符修饰,我们不去看父类的定义并不会知道在子类中这是一个虚函数,为了解决可读性问题,我们可以在子类中也加上virtual修饰符,但也同样会带来如下代码中的问题:
class A { public: virtual void show_info(int x) { std::cout << "i am class A" << std::endl; } }; class B : public A { public: virtual void show_info(float x) { std::cout << "i am class B" << std::endl; } };
本意是想重写父类中的show_info(int x)函数,但是写成了show_info(float x),这样写就已经不是重写了,而是变成了重载。为了解决可读性及这种重写被不小心写成重载的问题,在C++11中当我们想重写父类的虚函数时,可以在子类中重写的虚函数后面加上override修饰符,这样既标识在子类中这是在重写父类中的虚函数,同时也可以防止重写被误写为重载,因为当子类中对应的函数声明和父类中不一致时,是编译不过的,示例如下:
// 正确的示范 #include <iostream> class A { public: virtual void show_info(int x) { std::cout << "i am class A" << std::endl; } }; class B : public A { public: //virtual void show_info(float a) override // 错误error C3668: “B::show_info”: 包含重写说明符“override”的方法没有重写任何基类方法 //{ // std::cout << "i am class B" << std::endl; //} virtual void show_info(int a) override // 正确 { std::cout << "i am class B" << std::endl; } };
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 透彻理解C++11新特性:右值引用、std::move、std::forward 2020-04-30
- 第十章 C++11新特性 2020-04-04
- C++模板详解(一):函数模板的概念和特性 2020-02-11
- C++ 模板常见特性(函数模板、类模板) 2020-01-09
- C++ 一篇搞懂继承的常见特性 2020-01-01
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash