C++关键字之 final 的作用
·
目录
一、作用
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;
更多推荐
所有评论(0)