面试题:C++ 中 final 关键字的作用?

在 C++ 中,final 是一个用于限制类或虚函数进一步派生或重写的关键字。它的主要作用是增强代码的安全性和可维护性。


1. 用于类

final 用于类时,表示该类不能被继承。

语法

class Base final {
// 类定义
};
class Base final {
    // 类定义
};
class Base final { // 类定义 };

示例

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

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

作用

  • 防止其他类继承该类,确保类的行为不会被修改。
  • 适用于设计不希望被扩展的类,例如工具类或某些核心类。

2. 用于虚函数

final 用于虚函数时,表示该虚函数不能在派生类中被重写。

语法

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

示例

class Base {
public:
virtual void show() final {
std::cout << "Base class" << std::endl;
}
};
class Derived : public Base {
public:
// 错误:show 是 final 函数,不能被重写
void show() override {
std::cout << "Derived class" << std::endl;
}
};
class Base {
public:
    virtual void show() final {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    // 错误:show 是 final 函数,不能被重写
    void show() override {
        std::cout << "Derived class" << std::endl;
    }
};
class Base { public: virtual void show() final { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: // 错误:show 是 final 函数,不能被重写 void show() override { std::cout << "Derived class" << std::endl; } };

作用

  • 防止派生类修改基类的特定行为,确保某些关键逻辑的一致性。
  • 适用于设计不希望被修改的虚函数,例如某些核心算法或接口。

3. 使用场景

  • 禁止继承:当设计一个类时,如果不希望其他类继承它,可以使用 final
  • 禁止重写:当设计一个虚函数时,如果不希望派生类重写它,可以使用 final
  • 优化性能:编译器可以对 final 类或函数进行优化,因为它们的继承关系或行为是确定的。

4. 总结

用途作用
禁止该类被继承,确保类的行为不会被修改。
虚函数禁止派生类重写该虚函数,确保函数的行为不会被修改。
设计意图增强代码的安全性和可维护性,防止意外的继承或重写。

final 是 C++11 引入的关键字,合理使用它可以提高代码的健壮性和可读性。

THE END
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容