C++11新特性之final override标识符

final:

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

1// 正确的示范 2#include <iostream> 3 4class A 5{ 6public: 7 void show_a_info() 8 { 9 std::cout << "i am class A" << std::endl; 10 } 11}; 12 13class B : public A 14{ 15public: 16 void show_b_info() 17 { 18 std::cout << "i am class B" << std::endl; 19 } 20}; 21 22int main() 23{ 24 B b; 25 b.show_a_info(); 26 b.show_b_info(); 27 return 0; 28} 29 30// 输出: 31// i am class A 32// i am class B 33 34// 错误的示范 35#include <iostream> 36 37class A final 38{ 39public: 40 void show_a_info() 41 { 42 std::cout << "i am class A" << std::endl; 43 } 44}; 45 46class B : public A 47{ 48public: 49 void show_b_info() 50 { 51 std::cout << "i am class B" << std::endl; 52 } 53}; 54 55int main() 56{ 57 B b; 58 b.show_a_info(); 59 b.show_b_info(); 60 return 0; 61} 62 63// 编译报错:错误 2 error C3246: “B”: 无法从“A”继承,因为它已被声明为"final"

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

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

 override:

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

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

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

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

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java核心技术36讲笔记

JavaBasic谈谈final、finally、finalize有什么不同?典型回答:final可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展,final的变量是不可以修改的,而final的方法也是不可以重写的(override)。finally则是

java常用的关键字

1、final关键字final关键字可用于修饰类、方法以及变量。修饰类:该类不能被继承,该类的所有方法和成员都被隐式地指定为final。修饰方法:锁定方法,任何继承类都不能修改他,所有的private方法都被隐式地指定为final方法。修饰变量:若修饰的变量为基本数据类型,该变量值被赋值后不可改变;若修饰的变量为引用类型的变量,该变量

Java 入门学习知识点整理

\JAVA一个文件写多个类(同级类)规则和注意点\在一个.java文件中可以有多个同级类, 其修饰符只可以public/abstract/final/和无修饰符public修饰的只能有一个,且必须要与文件名相同

Java中static、final、static final的区别

说明:不一定准确,但是最快理解。final:final可以修饰:属性,方法,类,局部变量(方法中的变量)final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。final修饰的属性表明是一个常数(创建后不能被修改)。