本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ 11 – final关键字简要介绍
原文链接:https://www.stubbornhuang.com/932/
发布于:2020年10月12日 17:20:19
修改于:2020年10月31日 16:42:40

如果在基类的虚函数声明中加上了final关键字,则表明后续的派生类不能重写该函数。
1 基类的虚函数上加上final关键字
表明基类后续的派生类不能重写该虚函数。
代码示例:
#include <iostream>
#include <memory>
using namespace std;
class Shape
{
public:
virtual void Area() final
{
std::cout << "Shape Area" << std::endl;
}
};
class Triangle : public Shape
{
public:
// 编译错误
virtual void Area()
{
std::cout << "Triangle Area" << std::endl;
}
};
int main()
{
std::shared_ptr<Triangle> pTriangle = std::make_shared<Triangle>();
pTriangle->Area();
getchar();
return 0;
}
我们在基类Shape中普通虚函数Area中增加了final关键字,又在派生类Triangle中增加了Area的实现,此时编译器会报错。
2 派生类的虚函数加上关键字final
在派生类的虚函数加上关键final说明该派生类后续的派生类不能重写该函数!
#include <iostream>
#include <memory>
using namespace std;
class Shape
{
public:
virtual void Area()
{
std::cout << "Shape Area" << std::endl;
}
};
class Triangle : public Shape
{
public:
virtual void Area() final;
};
class MyTriangle : public Triangle
{
public:
// 编译错误
virtual void Area()
{
std::cout << "Triangle Area" << std::endl;
}
};
int main()
{
std::shared_ptr<Triangle> pTriangle = std::make_shared<Triangle>();
pTriangle->Area();
getchar();
return 0;
}
3 派生类的虚函数同时加上关键字override和final
在派生类类的虚函数加上关键字override和final,说明派生类后续的派生类不能重写该函数,但是当前派生类可以重写当前基类的虚函数!
#include <iostream>
#include <memory>
using namespace std;
class Shape
{
public:
virtual void Area()
{
std::cout << "Shape Area" << std::endl;
}
};
class Triangle : public Shape
{
public:
// 正确
virtual void Area() override final
{
std::cout << "Triangle Area" << std::endl;
}
};
class MyTriangle : public Triangle
{
public:
// 编译错误
virtual void Area() override
{
std::cout << "Triangle Area" << std::endl;
}
};
int main()
{
std::shared_ptr<Triangle> pTriangle = std::make_shared<Triangle>();
pTriangle->Area();
getchar();
return 0;
}
当前分类随机文章推荐
- C++ - std::string字符串格式化方法总结 阅读653次,点赞0次
- C++ - 拷贝构造函数与拷贝构造函数调用时机 阅读261次,点赞0次
- C++ - C++使用cuda api获取当前GPU显卡的总共的显存容量、已使用显存容量、剩余显存容量 阅读3867次,点赞2次
- C++ - return this和return *this的含义和区别 阅读272次,点赞0次
- C++ - 将一维数组/二维数组/三维数组作为函数参数传递给函数 阅读1393次,点赞0次
- C++ – 字节数组byte[]或者unsigned char[]与bool的相互转换 阅读863次,点赞1次
- C++11 - 使用std::thread,std::shared_future,std::promise并行化/多线程化for循环,提升处理速度 阅读1377次,点赞0次
- C++11/std::atomic - 原子变量(不加锁实现线程互斥) 阅读6128次,点赞2次
- C++ - 在某一天某个时间点定时执行任务,比如2022年9月19日晚上9点准点执行发送邮件函数 阅读307次,点赞0次
- C++11 - 使用std::thread::join()/std::thread::detach()方法需要注意的点 阅读2700次,点赞0次
全站随机文章推荐
- WordPress - 修改WP Editor.md markdown编辑器插件从剪切板粘贴图片上传的清晰度和质量 阅读930次,点赞0次
- Python – 解决opencv-python使用cv2.imwrite()保存中文路径图片失败的问题 阅读1322次,点赞0次
- 深度学习 - 数据集中训练集、验证集、测试集的划分以及各自作用 阅读1938次,点赞0次
- Youtube运营 - Youtube中如何删除频道 阅读163次,点赞0次
- TensorRT - 安装TensorRT工具Polygraphy 阅读3780次,点赞0次
- 资源分享 - Game Programming Gems 2 英文高清PDF下载 阅读1847次,点赞0次
- Python - list与字符串str相互转换方法总结 阅读568次,点赞0次
- WebGL/ThreeJS - 相关文档、教程网站 阅读297次,点赞0次
- WordPress - 禁用XML-RPC接口,禁止访问xmlrpc.php,避免DDOS攻击,防止暴力破解 阅读2690次,点赞0次
- WordPress - 在编辑文章发布时弹出是否发布提醒框 阅读3209次,点赞0次
评论
167