[C++] C++11新特性之final和override关键字

本文详细介绍了C++中`final`和`override`关键字的使用。`override`用于确保派生类的方法覆盖基类的虚函数,如果匹配不正确,编译器会报错。而`final`则阻止进一步的覆盖,使得函数或类不可被继承或重写。通过实例展示了这两个关键字的正确用法及其在避免错误和确保多态性方面的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

final和override说明符出现在形参列表(包括任何const或者引用修饰符)以及尾置返回类型之后

override

派生类如果定义了一个函数与基类中的虚函数名字相同但是形参列表不同,这仍然是合法的行为

编译器将会认为新定义的这个函数与基类中原有的函数相互独立

派生类中的函数并没有覆盖掉基类中的函数版本

这实际上是一个错误,但是编译器并没有发现这个错误

C++11中可以使用override关键字来说明派生类中的虚函数

如果派生类中使用了override标记了某个函数,但该函数并没有覆盖基类中已存在的虚函数,此时编译器将会报错

struct A {
    virtual void fun1(int) const;//const成员函数中不能改变成员变量
    virtual void fun2();
    void fun3();
};

struct B : A {
    void fun1(int) const override;//正确,派生类中的fun1也是虚函数,fun1覆盖掉基类中已存在的fun1
    void fun2(int) override;//错误,基类A中没有形式fun2(int)的函数,声明不匹配
    void fun3() override;//错误,fun3()不是虚函数,只有虚函数才能被覆盖
    void fun4() override;//错误,基类A中没有名为fun4的函数
};

final

虚函数使用final

我们还可以把某个函数指定为final

某个函数被定义成final以后,任何尝试覆盖该函数的操作都将引发错误

struct A {
    virtual void fun1(int) const;//const成员函数中不能改变成员变量
    virtual void fun2();
    void fun3();
};

struct B : A {
    //从A继承fun2()和fun3(),覆盖fun1(int)
    void fun1(int) const final;//不允许后续其他类覆盖fun1(int)
};

struct C : B {
    //从B继承fun3(),覆盖fun2()
    void fun2();//正确,覆盖从间接基类A继承而来的fun2()
    void fun1(int) const;//错误,B已经将fun1声明成了final
};

类使用final

定义一个类

  • 不希望其他类继承它
  • 或者不想考虑它是否适合作为一个基类

在类名后面加一个final关键字,防止继承发生

class A final {
	//类成员
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值