zl程序教程

您现在的位置是:首页 >  其他

当前栏目

override关键字和final关键字

2023-03-14 22:50:44 时间

override关键字

  • 派生类如果定义了一个函数与基类中虚函数的名字相同但是形参列表不同,编译器将认为新定义的这个函数与基类中原有的函数是相互独立的。这时,派生类的函数没有覆盖掉基类中的版本。
  • 如果我们使用override关键字标记某个函数,但该函数并没有覆盖已存在的虚函数,此时编译器将报错。
class B
{
	virtual void f1(int) const {};
	virtual void f2() {};
	void f3() {};
};
class D :B //默认私有继承
{
	void f1(int) const override {};//正确:f1与基类中的f1匹配
	void f2(int) override {};//错误:B没有形如f2(int)的函数
	void f3()override;//错误:f3不是虚函数
	void f4()override;//错误:B没有名为f4的函数
};
  • override关键字只能用于虚函数中,因为只有虚函数才能被覆盖

final关键字

  • 我们可以把某个函数指定为final,如果我们已经把函数定义成final了,则之后任何尝试覆盖该函数的操作都会引发错误:
class B
{
public:
	virtual void f1(int) const {};
	virtual void f2() {};
	void f3() {};
};
class D1:B //默认私有继承
{ 
public:
	//从B继承f2()和f3(),覆盖f1(int)
	void f1(int) const final {};//不让后续其他类覆盖f1(int)
};
class D2 :D1
{
public:
	void f2() {};//正确:覆盖从间接基类B继承而来的f2
	void f1(int) const {};//错误:D1已经将f2声明成final

};
class D3 :B
{
public:
	void f1(int) {};//正确:因为只有继承至B的子类才不能覆盖f1函数
};