C++11新特性之final override标识符
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 ;
} // 输出:
// 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 ;
} // 编译报错:错误 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 = ;
// do_something()
return;
}
}; int main()
{
A *a_ptr = new B();
a_ptr->show_info();
return ;
}
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;
}
};
C++11新特性之final override标识符的更多相关文章
- C++11新特性之七——final/override控制
重载和重写的区别参见: C++继承中重载.重写.重定义的区别: 在了解C++11中的final/override关键字之前,我们先回顾一下C++关于重载的概念.简单地说,一个类A中声明的虚函数fun在 ...
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- C++ 11 新特性
C++11新特性: 1.auto 2.nullptr 3.for 4.lambda表达式 5.override ...
- c++学习书籍推荐《深入理解C++11 C++11新特性解析与应用》下载
百度云及其他网盘下载地址:点我 编辑推荐 <深入理解C++11:C++11新特性解析与应用>编辑推荐:C++标准委员会成员和IBM XL编译器中国开发团队共同撰写,权威性毋庸置疑.系统.深 ...
- C++11新特性总结 (二)
1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...
- C++11新特性总结 (一)
1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...
- C++11新特性——range for
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中.range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作. 1.基本语法 for(d ...
随机推荐
- EF 6.0 The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value. c#中的时间
在SQL server 中,有两种日期时间类型: 1.DateTime 它的范围是 1753-1-1 至 9999-12-31 2.DateTime2 它的满园是 0001-01-01 至 9999- ...
- package-lock.json到底是干嘛的?(转载)
package-lock.json到底是干嘛的? https://mp.weixin.qq.com/s/NaVVljKrQAFmHMdbkaYmPg## nvm-windows https://git ...
- IDC 内网机器 通 过 iptables SNAT上网的配置方法
有三台机器, A .B .C,其中A机器有外网和内网IP,B和C只有内网,我们配置B和C二台机器通过A机器来上外网. 假设A机器 外网IP为: 60.12.13.14 内网IP为: 192.168. ...
- 转:Oculus Unity Development Guide开发指南(2015-7-21更新)
http://forum.exceedu.com/forum/forum.php?mod=viewthread&tid=34175 Oculus Unity Development Guide ...
- 强连通分量初探 By cellur925
并不理解.但是毕竟也做了一些题,略微小结. 注:这里讨论的暂时是有向图的强联通分量. 先贴出模板.学长:我也不理解,但我可以叫你们怎么背代码. #include<cstdio> #incl ...
- Elasticsearch 2.3.2 安装部署
先按照http://blog.csdn.net/love13135816/article/details/51690280这个教程安装, 不过后面的IK分词器安装部分有问题. 所以中文分词器插件的安装 ...
- LightOj 1197 Help Hanzo (区间素数筛选)
题目大意: 给出T个实例,T<=200,给出[a,b]区间,问这个区间里面有多少个素数?(1 ≤ a ≤ b < 231, b - a ≤ 100000) 解题思路: 由于a,b的取值范围 ...
- 题解报告:hdu 1075 What Are You Talking About
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 Problem Description Ignatius is so lucky that he ...
- E. The Values You Can Make 背包,同时DP
http://codeforces.com/problemset/problem/688/E 题目需要在n个数中找出一个集合,使得这个集合的和为val,然后问这些所有集合,能产生多少个不同的和值. 题 ...
- 1354 选数字 DP背包 + 数学剪枝
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1354&judgeId=187448 其实这题和在若干个数字中,选 ...