关于

本文代码演示环境: win10 + vs2017

一个困扰

之前MFC用的多了,发现一个问题: 子类窗口的某个函数是否重载了基类的函数。解决办法是: 打开基类的代码,一个个排查。

这只是一个具体化的例子。

override 和 final

c++11引入关键字 overridefinal 用来解决继承中虚函数的问题。

关键字 作用
override 指明该函数重载的基类中的一个函数
final A.禁止该函数从基类继承;B.禁止该函数的重载

用法

注意: 这俩关键字 必须作用于虚函数。否则,编译提示将出错。

错误示范

代码

class case_err
{
public:
// 错误,编译器提示: error C3668: “case_err::name()”: 包含重写说明符“override”的方法没有重写任何基类方法
void name() override {} // error C3609: “demo_class::gender”: “final”函数必须是虚函数
void gender() final {}
};

正确用法

基类

class base_class
{
public:
// 用作测试 override 关键字的函数
virtual void show() { std::cout << "base_class::show()\n"; } // 用作测试 final 关键字的函数
virtual void say() final { std::cout << "base_class::say()\n"; }
};

派生类

class demo_class : public base_class
{
public:
// override的作用:指明该函数时重载的基类中的一个函数
// 这里明确指明该函数是继承基类的show函数
virtual void show() override { std::cout << "demo_class::show()\n"; } // 编译错误: error C3248: “base_class::say”: 声明为“final”的函数无法被“demo_class::say”重写
// virtual void say() override { std::cout << "demo_class::say()\n"; }
};

纯虚函数

纯虚函数一种特殊的虚函数。 but,纯虚函数通常用作基类定义接口。 显然,纯虚函数不能使用关键字override. 那 final 关键字呢? 一个例子:

class base_class
{
public:
virtual void run() final = 0;
};

理论分析: 纯虚函数 run 使用关键字 final后,run函数不能被派生类(子类)继承并实现,且语法也正确。 实际: 编译通过。

but类base_class及继承自base_class的类均无法创建对象。因为: base_class的run函数是一个纯虚函数且无法被派生类继承。

结论: 纯虚函数使用final关键字,无实际意义。

C++11之重写说明符override和final的更多相关文章

  1. C++11学习笔记(5) —— override and final (转)

    原文转自 http://blog.csdn.net/fire_lord/article/details/8540592 1.简介 C++为我们提供了继承和虚函数的重写特性. 在派生类中,重写虚函数不强 ...

  2. C++11 override和final

    30多年来,C++一直没有继承控制关键字.最起码这是不容易的,禁止一个类的进一步衍生是可能的但也很棘手.为避免用户在派生类中重载一个虚函数,你不得不向后考虑. C++ 11添加了两个继承控制关键字:o ...

  3. [转][C++ 11]override and final - write clean and maintainable C++ code

    原文: http://arne-mertz.de/2015/12/modern-c-features-override-and-final/ Today I write about a pair of ...

  4. C++11 override 和 final 关键字

    C++11之前,一直没有继承控制关键字.禁用一个类的进一步衍生是可能的但也很棘手.为避免用户在派生类中重载一个虚函数,你不得不向后考虑. C++ 11添加了两个继承控制关键字:override和fin ...

  5. java 中重载(Overload)和重写(Override)的区别

    首先重载和重写是应用于两个不同场景下面的两种不同的手段: 两者各自的特征: 重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不 ...

  6. 0605-类的继承、重写、parent、final

    定义一个子类(man) //定义一个类 class renlei{ var $name = '王五'; var $age = ''; var $sex = ''; var $todo = ''; fu ...

  7. 大厂面试题系列:重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分

    面试题:重载(Overload)和重写(Override)的区别.重载的方法能否根据返回类型进行区分 面试官考察点猜想 这道题纯粹只是考查基础理论知识,对实际开发工作中没有太多的指导意义,毕竟编辑器都 ...

  8. Cannot override the final method from SherlockFragmentActivity

    调用ActionBarSherlock后页面找不到onCreateOptionsMenu报错 com.actionbarsherlock.app.SherlockFragmentActivity.on ...

  9. 转:C++的重载(overload)与重写(override)

    C++ override overload 的区别  override是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数.在C++中,经常发生在类的继承中.当基类中的某个方法是virtual ...

随机推荐

  1. R数据科学-1

    R数据科学(R for Data Science) Part 1:探索 by: PJX for 查漏补缺 exercise: https://jrnold.github.io/r4ds-exercis ...

  2. Linux学习——Gdb基本调试方法&&多线程调试

    1.Gdb的基本调试 示例代码 //e.c #include <stdio.h> void debug(char *str) { printf("debug info :%s\n ...

  3. C++ 中的多重继承的问题

    如何正确使用C++多重继承 BY R12F · PUBLISHED 2011年06月17日 · UPDATED 2012年03月11日   原创文章,转载请注明:转载自Soul Apogee本文链接地 ...

  4. git提交指定文件

    1. 用git add 命令添加第一个commit需要的文件 git add file1 git add file2 2. 隐藏其他修改,git stash 的参数中 -k 开关告诉仓库保持文件的完整 ...

  5. 优化if else嵌套代码

    写在前面 不知大家有没遇到过像"横放着的金字塔"一样的if else嵌套: if (true) { if (true) { if (true) { if (true) { if ( ...

  6. 转 Android中Activity的启动模式(LaunchMode)和使用场景

    转载请注明出处:http://blog.csdn.net/sinat_14849739/article/details/78072401本文出自Shawpoo的专栏我的简书:简书 一.为什么需要启动模 ...

  7. SpringIOC原理浅析

    1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械 ...

  8. Shell脚本定期清空大于1G的日志文件

    一个关于如何在指定文件大于1GB后,自动删除的问题. 批处理代码如下: #!/bin/bash # 当/var/log/syslog大于1GB时 # 自动将其备份,并清空 # 注意这里awk的使用 i ...

  9. maven项目install时忽略执行test

    1.在项目所在文件夹根目录使用maven命令打包时: <!-- 不执行单元测试,也不编译测试类 --> mvn install -Dmaven.test.skip=true 或 <! ...

  10. 看看线程特有对象ThreadLocal

    作用:设计线程安全的一种技术. 在使用多线程的时候,如果多个线程要共享一个非线程安全的对象,常用的手段是借助锁来实现线程的安全.线程安全隐患的前提是多线程共享一个不安全的对象 ,那么有没有办法让线程之 ...