106-C++_final和override

文章详细解释了C++中的final和override关键字的用途。final用于阻止类的继承或虚函数的重写,确保函数不会在派生类中被覆盖。而override则用于明确指定一个虚函数覆盖基类的对应虚函数,增强代码可读性和准确性。这两个关键字在保证多态性和防止编程错误方面起到关键作用。
摘要由CSDN通过智能技术生成

文章目录

一.final

final指定某个虚函数不能在派生类中被覆盖,或者某个类不能被派生。

当在虚函数声明或定义中使用时,final 说明符确保函数为虚并指定它不能被派生类覆盖,否则程序非良构(生成编译时错误)。

当在类定义中使用时,final 指定此类不能在另一类的定义中的 基类说明符列表 中出现(换言之,不能派生于它),否则程序非良构(生成编译时错误)。final 也可以用于联合体定义,此时下它没有效果(除了 std::is_final 的输出结果) (C++14 起),因为不能从联合体派生。

final 是在成员函数声明或类头部中使用时有特殊含义的标识符。其他语境中它未被保留,而且可用于命名对象或函数。
C++11中增加了 fina关键字来限制某个类不能被继承,或者某个虚函数不能被重写。如果修饰函数,final只能修饰虚函数,并且要放到类或者函数的后面。下面是 final 的用法:

class A
{
public:
	virtual void fun()final;
	//final  限定该虚函数不能被重写

	void bar()final;
	//error final只能修饰虚函数

};

class B final :public A//class是最终类,不能派生出新的类,不能被继承
{
public:
	virtual void fun();
	//error fun不能被重写因为在A中是一个final
};

class C :public B//error B是一个最终类不能被继承
{

};

二.override

override 指定一个虚函数覆盖另一个虚函数

如果使用标识符 override,那么它紧随成员函数声明或类定义内的成员函数定义语法中的声明符之后出现。

声明符 虚说明符序列(可选) 纯说明符(可选) (1)
声明符 虚说明符序列(可选) 函数体 (2)

  1. 在成员函数声明中,override 可以在紧随声明符之后并在 纯说明符 之前(如有使用)的 虚说明符序列 中出现。
  2. 在类定义内成员函数定义中,override 可以在紧随声明符之后并紧接 函数体 之前的 虚说明符序列 中出现。
    两种情况中,如果使用 虚说明符序列 ,那么它必须是 override、final、final override 或 override final 之一。

override 关键字确保在派生类中声明的重写函数与基类的虚函数有相同的签名,同时也明确表明将会重写基类的虚函数,还可以防止因疏忽把本来想重写基类的虚函数声明成重载。这样,既可以保证重写虚函数的正确性,又可以提高代码的可读性。override关键字和 final关键字一样,需要放到方法后面。

struct A
{
    virtual void foo();
    void bar();
};
 
struct B : A
{
    void foo() const override; // 错误:B::foo 不覆盖 A::foo
                               // (签名不匹配)
    void foo() override; // OK:B::foo 覆盖 A::foo
    void bar() override; // 错误:A::bar 非虚
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值