1. final
C++ 中增加了 final 关键字来限制某个类不能被继承,或者某个虚函数不能被重写,和 Jave 的 final 关键字的功能是类似的。如果使用 final 修饰函数,只能修饰虚函数,并且要把final关键字放到类或者函数的后面。

1.1 修饰函数
如果使用 final 修饰函数,只能修饰虚函数,这样就能阻止子类重写父类的这个函数了:

class Base
{
public:virtual void test(){cout << "Base class...";}
};class Child : public Base
{
public:void test() final{cout << "Child class...";}
};class GrandChild : public Child
{
public:// 语法错误, 不允许重写void test(){cout << "GrandChild class...";}
};

在上面的代码中一共有三个类:

基类:Base
子类:Child
孙子类:GrandChild
test() 是基类中的一个虚函数,在子类中重写了这个方法,但是不希望孙子类中继续重写这个方法了,因此在子类中将 test() 方法标记为 final,孙子类中对这个方法就只有使用的份了。

1.2 修饰类
使用 final 关键字修饰过的类是不允许被继承的,也就是说这个类不能有派生类。

class Base
{
public:virtual void test(){cout << "Base class...";}
};class Child final: public Base
{
public:void test(){cout << "Child class...";}
};// error, 语法错误
class GrandChild : public Child
{
public:
};

Child 类是被 final 修饰过的,因此 Child 类不允许有派生类 GrandChild 类的继承是非法的,Child 是个断子绝孙的类。

2. override
override 关键字确保在派生类中声明的重写函数与基类的虚函数有相同的签名,同时也明确表明将会重写基类的虚函数,这样就可以保证重写的虚函数的正确性,也提高了代码的可读性,和 final 一样这个关键字要写到方法的后面。使用方法如下:

class Base
{
public:virtual void test(){cout << "Base class...";}
};class Child : public Base
{
public:void test() override{cout << "Child class...";}
};class GrandChild : public Child
{
public:void test() override{cout << "Child class...";}
};

上述代码中第 13 行和第 22 行就是显示指定了要重写父类的 test() 方法,使用了 override 关键字之后,假设在重写过程中因为误操作,写错了函数名或者函数参数或者返回值编译器都会提示语法错误,提高了程序的正确性,降低了出错的概率。

C++ 11 新特性(十一)final和override相关推荐

  1. C++11 新特性简介

    1.auto auto是旧关键字,在C++11之前,auto用来声明自动变量,表明变量存储在栈,很少使用.在C++11中被赋予了新的含义和作用,用于类型推断. auto关键字主要有两种用途:一是在变量 ...

  2. C++11新特性之十一:emplace

    emplace操作是C++11新特性,新引入的的三个成员emplace_front.emplace 和 emplace_back.这些操作构造而不是拷贝元素到容器中,这些操作分别对应push_fron ...

  3. java9特性_96.java基础10(java9/10/11新特性)

    126.java 9 新特性1(模块化功能): 1.java模块化 2.java 交互式环境jshell 3.泛型 package com.atguigu.java; import org.junit ...

  4. 《深入理解C++11:C++ 11新特性解析与应用》——导读

    前 言 为什么要写这本书 相比其他语言的频繁更新,C++语言标准已经有十多年没有真正更新过了.而上一次标准制定,正是面向对象概念开始盛行的时候.较之基于过程的编程语言,基于面向对象.泛型编程等概念的C ...

  5. C++11新特性的总结

    C++11新特性 auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11) C++动态内存管理 序列式容器 array forward_list; 继承和 ...

  6. C++11新特性选讲 语言部分 侯捷

    C++11新特性选讲 语言部分 侯捷 本课程分为两个部分:语言的部分和标准库的部分.只谈新特性,并且是选讲. 本文为语言部分笔记. 语言 Variadic Templates move semanti ...

  7. 【C/C++】C++98基础上的C++11新特性

    一.新语法 1.自动类型推导auto auto的自动推导,用于从初始化表达式中推断出变量的数据类型. //C++98 int a = 10; string s = "abc"; f ...

  8. 【C++面试宝典】C++11新特性知识总结

    目录 C++11新特性 auto自动类型推导 decltype类型指示符 nullptr常量 lambda表达式(匿名函数) 智能指针 auto_ptr unique_ptr shared_ptr w ...

  9. A Morden C++ —— C++11新特性指南

    A Morden C++ -- C++11新特性指南 by JOKER on 2013/10/14 不知不觉C++1x,也就是以前的C++0x已经基本达到工业使用的成熟度了,各个编译器的实现也很完整了 ...

  10. C++11新特性(原封不动转载待查)

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

最新文章

  1. 在windows中安装python
  2. Graphpad Prism计算IC50
  3. 在html中标记中可以嵌套标记,如何在LESS CSS嵌套类中指定html标记?
  4. 如何在php中写内容,请问如何在内容模板中写标题和内容呢
  5. 看着女朋友的肚子,以肉眼可见的速度大起来......
  6. insertSelective 和 insert 的区别
  7. python filter函数_python基础——filter函数
  8. java动态数组储存敌机_如何使用参数通过graphql将动态数组字符串存储为neo4j中的节点属性?...
  9. C++设计模式之Singleton模式(单例模式)
  10. CentOS6编译装载nbd模块
  11. [MDB] EXP 导入数据库
  12. 1.4. network
  13. python xlwt安装_python:安装xlwt模块
  14. 2063:【例1.4】牛吃牧草
  15. [前端]-- jquery学习1
  16. 房地产投资占GDP比例畸高 中国房地产泡沫是一颗毒瘤
  17. futuretask java 并发请求_【Java并发】Runnable、Callable、Future、FutureTask
  18. 大脑状态的重构与认知行为之间的映射
  19. python 完全面向对象_python之面向对象
  20. Pytorch 之修改Tensor部分值

热门文章

  1. javase11源码文件_JavaSE 7,8:确定特定文件系统支持的视图
  2. Hibernate事实:集成测试策略
  3. Vaadin Flow –奇妙的鹿
  4. web.xml.jsf_使用JSF 2.2功能来开发可滚动,可延迟加载的Ajax数据表
  5. Java SE 11(18.9)中的API更新
  6. 适用于Java开发人员的Elasticsearch:Java的Elasticsearch
  7. JavaParser入门:以编程方式分析Java代码
  8. 使用Flyway在Java EE中进行数据库迁移
  9. 使用JAX-RS和Spring构建HATEOAS API
  10. Spring Data JPA教程:获取所需的依赖关系