C++ 语言特性14 - override 和 final 关键字
一:override 关键字
override
关键字用于确保派生类中的函数正确地重写了基类中的虚函数。
//使用override关键字可以确保你重写的函数与基类中的虚函数签名完全匹配
class Base {
public:
virtual void foo() const {}
};
class Derived : public Base {
public:
void foo() const override {} // 正确重写基类虚函数
};
//如果派生类的函数与基类的虚函数签名不匹配,编译器会报错,这有助于避免潜在的错误
class Derived : public Base {
public:
void foo() override {} // 错误:缺少const限定符,签名不匹配
};
二:final 关键字
final
关键字用于防止继承和重写操作。它可以用于类和成员函数。
//用于成员函数
class Base {
public:
virtual void foo() const final {
// 实现
}
};
class Derived : public Base {
public:
// void foo() const override {} // 错误:不能重写基类中标记为final的函数
};
//用于类
class FinalClass final {
// 成员定义
};
class DerivedFromFinal : public FinalClass {
// 错误:FinalClass被声明为final,不能被继承
};
三:override(重写) 与overload(重载)的区别:
1. overide 是C++中的关键字,而overload 不是。
2. override 和 overload 在面向对象编程中扮演不同的角色:
2.1: override是指在派生类中重新定义基类中的虚函数,以改变其行为。重写是面向对象编程中多态性的一部分,它涉及到继承。
class Base {
public:
virtual void display() const { std::cout << "Base display" << std::endl; }
};
class Derived : public Base {
public:
void display() const override { std::cout << "Derived display" << std::endl; }
};
2.2: overload 是指在同一个作用域内,允许存在多个同名的函数,但它们的参数类型、数量或顺序必须不同。overload 不涉及继承,它是基于函数签名的区分。
class Example {
public:
void print(int i) { /* ... */ }
void print(double f) { /* ... */ }
void print(int i, double f) { /* ... */ }
};