C++11之 final/override关键字

1、final关键字

C++ 中增加了 final 关键字来限制某个类不能被继承,或者某个虚函数不能被重写,和 Jave 的 final 关键字的功能是类似的。如果使用 final 修饰函数,只能修饰虚函数,并且要把final关键字放到类或者函数的后面。

  • C++新标准规定:如果我们定义的类不希望被其他类继承,那么可以在类名后加一个final关键字,但是final类仍然可以继承其他类。
  • 实际上C++11的关键字final有两个用途。第一,它阻止了从类继承;第二,阻止一个虚函数的重载。

1.1 、final修饰类

被final修饰的类不能作为派生类,也就是说不能被其他类所继承。

class Grandpa
{
public:
	virtual void TestFunc()
	{
		std::cout << "Grandpa Class";
	}
};

class Dad final:Grandpa
{
public:
	virtual  void TestFunc()
	{
		std::cout << "Dad Class";
	}
};

class Child  final :Dad
{
public:
	virtual  void TestFunc()
	{
		std::cout << "Child Class";
	}
};

在这里Dad 类是被final修饰的,所以Dad不能作为派生类,此时Child类不能继承于Dad类。

1.2、final修饰函数

final除了修饰类,也能修饰函数,不能只能修饰虚函数,被修饰的虚函数禁止了子类对虚函数的重写

class Grandpa
{
public:
	virtual void TestFunc() final
	{
		std::cout << "Grandpa Class";
	}
};

class Dad:Grandpa
{
public:
	virtual  void TestFunc()
	{
		std::cout << "Dad Class";
	}
};

在上述代码中,Grandpa类的虚函数TestFunc被final关键字修饰,子类Dad继承于Grandpa类,当子类Dad重写TestFunc函数将报错,子类Dad只能使用父类Grandpa实现的TestFunc函数。

2、override关键字

在C++的重载中,对于基类声明为virtual的函数,派生类的重载版本不再需要声明该函数为virtual,即使认为的写上virtual,编译器也会对此进行忽略。虽然这样的特性对程序员来说带来了一定的便利性,有得必有失,带来便利的同时,也造成了阅读上的一些困难。程序员无法从派生类对该函数的定义中判断出此函数是虚函数还是非虚函数。

对此,在C++11中引入了override关键字,如果在派生类的虚函数中使用了override关键字,基类中必须重载同名的函数,否则将无法通过编译。override关键字使得程序员可以明确的知道派生类中哪些函数是基类定义的虚函数。

class Grandpa
{
public:
	virtual void TestFunc()
	{
		std::cout << "Grandpa Class";
	}
};

class Dad:Grandpa
{
public:
	virtual  void TestFunc() override
	{
		std::cout << "Dad Class";
	}
};

Grandpa的派生类Dad重写了虚函数TestFunc,当程序员写错虚函数名时,编译器将会提示语法错误。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是一只程序猿啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值