c++ final关键字的理解

在C++中,关键字`final`用于指示该成员函数或类不能被派生类重新定义或继承,保证了代码的安全性。

以下是一些使用`final`需要注意的事项:

1. `final`仅适用于虚函数和类定义,对于其他成员函数,使用`final`是无效的。

2. 若类被声明为`final`,则该类不能被继承。

3. 若虚函数被声明为`final`,则该虚函数不能被派生类重写。

4. 若派生类覆盖了一个声明为`final`的虚函数,编译器会报错。

final为权限掠夺者,主要作用是:

1.掠夺函数权限:阻止函数重写

2.掠夺类的权限:阻止派生

// final关键字作用在函数上
#include <iostream>
#include <string>

using namespace std;

class Father
{
public:
    Father() {

    }
    ~Father() {

    }
    virtual void virtualFatherFunc();
};

class Son : public Father
{
public:
    Son() {

    }
    ~Son() {

    }
    // final作用在函数上,阻止子类重写这个虚函数
    void virtualFatherFunc() final;
};

class GSon : public Son
{
public:
    GSon() {

    }
    ~GSon() {

    }
    // 父类的这个虚函数使用final终结了重写的权限,所以在这里不能重写这个继承的虚函数
    // void virtualFatherFunc();
};

int main()
{
    return 0;
}

// final作用在类上
#include <iostream>
#include <string>

using namespace std;

// final作用在类上阻止该类被继承
class ClassName final
{
public:
    ClassName() {
    }
    ~ClassName() {
    }
private:

};

// 不能将final类型的类作为基类
// class Son : public ClassName
// {
// };

int main()
{
    return 0;
}

// final作用在纯虚函数上
#include <iostream>
#include <string>

using namespace std;

class ClassName
{
public:
    ClassName() {}
    ~ClassName() {}
    // final必须加在参数列表后面
    virtual void virtualFunc() final = 0;
};

class Son : public ClassName
{
};

// 纯虚函数必须重写之后才能创建对象
// 函数加上final之后阻止函数重写
// 所以不管派生多少次,派生类都不能创建对象
class GSon : public Son
{
};

int main()
{
    // 因为继承了抽象类,所以永远不能继承对象,不管派生多少次
    // GSon obj_gson;
    return 0;
}

#include <iostream>
#include <string>

using namespace std;

class Animal
{
public:
    // 函数被声明为final,因此任何子类都不能重写后覆盖该函数
    virtual void eat() final{
        cout << "Animals eats" << endl;
    }
};

class Cat : public Animal
{
public:
    // 错误, eat 函数被 Animal 类中的 final 标识符保护
    // virtual void eat() {}
};

int main()
{
    Animal animal;
    animal.eat();
    // `animal.eat()`输出`Animal eats`,表明父类函数`eat`之前被调用。
    // 但是,在实例化`Cat`类后,`cat.eat()`调用到的还是`Animal`类中的`eat`函数,而不是`Cat`类中的。
    Cat cat;
    cat.eat();

    return 0;
}

`final`关键字能够有效地帮助C++开发人员避免重写重要的方法和继承禁止的类,更严谨地保证了代码的安全性。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值