C++中的override和final关键字
2019-07-30 22:41
141 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_38104725/article/details/97828096
C++中的override和final关键字
C++11 中新引入的override和final关键字,他们有什么用途呢?
以代码为例
final关键字
例1:
#include <iostream> using namespace std; class A { public: virtual void Test() final{ cout << "TestA" << endl; } }; class B :public A { void Test() { cout << "TestB" << endl;//报错无法重写“final”函数 "A::Test" } };
由例子可知,编译器会检测出这个函数不能被覆盖,因此会将其从类的虚表中删除。
例2:
#include <iostream> using namespace std; class A final{ public: virtual void Test(){ cout << "TestA" << endl; } }; class B :public A {//报错,不能将“final”类类型用作基类 void Test() { cout << "TestB" << endl; } };
有例子可知,标记为
final的类,编译器则不会生成虚表。程序不希望A类被继承
override关键字
例1:
#include <iostream> #include <memory> using namespace std; class A { public: virtual void Test(int) const{cout << "This is classA" << endl; } }; class B : public A { public: virtual void Test(double) const{ cout << "This is classB" << endl; } }; int main() { shared_ptr<A>a = make_shared<B>(); a->Test(99); return 0; }
运行的结果为:
This is classA
但从main函数设计来说,A类指针a指向classB类对象。因为Test是一个虚函数,所以一般可以认为a对Test函数的调用将选择 classB类的版本。
但事实是a指针调用了classA的Test函数。原因就是是这两个函数有不同的形参类型,所以 B 类中的 Test 不能覆盖 A 类中的 Test。基类中的函数釆用的是 int 类型的参数,而派生类中的函数釆用的则是double类型的参数,因此,B 类中的 Test 只不过是重载 A 类中的 Test 函数。
正确代码:
#include <iostream> #include <memory> using namespace std; class A { public: virtual void Test(int) const{cout << "This is classA" << endl; } }; class B : public A { public: virtual void Test(int) const override{ cout << "This is classB" << endl; } }; int main() { shared_ptr<A>a = make_shared<B>(); a->Test(99); return 0; }
函数运行结果为:
This is classB
修改后的代码把B类的函数形参改为int,并添加了override关键字。override 关键字就是告诉编译器,该函数应覆盖基类中的函数。如果该函数实际上没有覆盖任何函数,则会导致编译器错误。
相关文章推荐
- C++关键字final与override
- C++ 11继承控制关键字:override(虚函数重载)和final(阻止继承、虚函数重载)
- c++ override 关键字介绍
- c++ final class 实现 非final 关键字
- c++的override关键字
- c++11 shared_ptr & unique_ptr & move semantics(右值引用) & lock_guard & final 和 override 关键字
- C++11特性之override和final关键字
- [转][C++ 11]override and final - write clean and maintainable C++ code
- c++11 特性 final与override关键字
- C++ final/override控制
- 写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide)。在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的,
- c++ final关键字
- c++ override 关键字
- 继承相关关键字Virtual、Abstract、override、Interface、final、Sealed全解析
- C++ 11 Lambda表达式、auto、function、bind、final、override
- override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字
- c++11学习 override 和 final 关键字
- c++11特性之override和final关键字
- [c++] final override keyword
- C++ 中提供的override 关键字