目录

一、作用

1.final修饰类(禁止继承)

2.final修饰虚函数(禁止重写)

3.final与override的区别

4.注意


一、作用

final作为一个关键字,用于禁止继承或者重写,主要应用于类和虚函数,核心作用是限制扩展性,确保某些类或方法不能被进一步修改

1.final修饰类(禁止继承)

        当一个类被声明为fianl时,不能被其他类继承

        适用于设计上不允许派生的类(如工具类、单例类等)

例如:

class Base final {  // Base 类不能被继承
public:
    void show() {
        std::cout << "Base class" << std::endl;
    }
};

// 错误:不能继承 final 类
class Derived : public Base {  // 编译错误!
public:
    void show() override {
        std::cout << "Derived class" << std::endl;
    }
};

编译报错:

error: cannot derive from 'final' base 'Base' in derived type 'Derived'

2.final修饰虚函数(禁止重写)

        当一个虚函数被声明为final时,派生类不能重写(override)该函数

        适用于基类中不允许子类修改的虚函数实现

class Base {
public:
    virtual void show() {
        std::cout << "Base class show()" << std::endl;
    }

    virtual void print() final {  // print() 不能被重写
        std::cout << "Base class print()" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() override {  // 允许重写 show()
        std::cout << "Derived class show()" << std::endl;
    }

    // 错误:不能重写 final 函数
    void print() override {  // 编译错误!
        std::cout << "Derived class print()" << std::endl;
    }
};

编译报错:

error: virtual function 'virtual void Derived::print()' overriding final function

3.final与override的区别

final               禁止继承或重写

override        显式声明重写基类虚函数

对比:

class Base {
public:
    virtual void foo() { std::cout << "Base::foo" << std::endl; }
    virtual void bar() final { std::cout << "Base::bar" << std::endl; }
};

class Derived : public Base {
public:
    void foo() override { std::cout << "Derived::foo" << std::endl; }  // 允许
    // void bar() override;  // 错误:bar() 是 final 的
};

4.注意

4.1 C++11引入,旧版本不支持final关键字

4.2 final只能用于类和虚函数,不能用于成员变量 例如: final int num=0;

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐