您的位置:首页 > 编程语言 > C语言/C++

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 关键字就是告诉编译器,该函数应覆盖基类中的函数。如果该函数实际上没有覆盖任何函数,则会导致编译器错误。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: