C++11之final

本文详细解析了C++11中final关键字的作用及用法。final可以用于限制虚函数不被派生类重写,或者防止一个类被继承。文章通过具体代码示例,清晰展示了final如何应用于类定义和成员函数声明中。

C++11之final

作用

限定虚函数或类。指定派生类不能覆写基类的虚函数,或类不能被继承。
位置:对虚函数而言,位置同 override; 对类来说,位于类名之后。
其他位置的 final 同 override 一样,并非保留标识符,无特殊含义,可用作对象名或函数名。

class Base
{
public:
   virtual void foo() { }
   void final() {}             // ok: 此处的 final 并无特殊含义,可以用作函数名
   void override() {}          // ok
};

class Derived : public Base
{
public:
   void foo() final { }        // ok 指定 foo 不能被 Derived 的派生类重写
   virtual void goo() final {} // ok 
   void hoo() final {}         // error: hoo 不是虚函数
};

class C final: public Derived  // 指定类 C 不能被继承
{
public:
   void foo() {}               // error: Derived::foo 被 final 限定, 在 Derived 的派生类 C 中不能被重写
};

class D : public C             // error: 类 C 由final限定,指定类 C 不能再被继承
{
};

final 与 override 的使用就是如此的简单 ?

### C++final 关键字的用法与含义 #### 1. final 的定义与作用 在 C++ 中,`final` 是一个关键字,用于限制类的继承或虚函数的重写行为。通过使用 `final`,可以明确指定某个类不可被继承,或者某个虚函数不可被进一步重写[^2]。 #### 2. 使用场景与示例 ##### 2.1 防止类的进一步派生 `final` 可以应用于类声明中,表明该类不能作为基类被其他类继承。 ```cpp class Base final { // 声明 Base 类为 final public: virtual void foo() {} }; class Derived : public Base { // 编译错误:Base 是 final 类,无法派生 public: void foo() override {} }; ``` 上述代码中,由于 `Base` 类被标记为 `final`,因此尝试从其派生 `Derived` 类会导致编译错误[^4]。 ##### 2.2 防止虚函数的进一步重写 `final` 还可以用于修饰虚函数,表示该虚函数在其派生类中不可被进一步重写。 ```cpp class Base { public: virtual void foo() final {} // 声明 foo() 为 final 虚函数 }; class Derived : public Base { public: void foo() override {} // 编译错误:foo() 已被声明为 final,无法重写 }; ``` 在此示例中,`Base::foo()` 被标记为 `final`,因此任何尝试在 `Derived` 类中重写 `foo()` 的行为都会导致编译失败[^3]。 #### 3. 实战案例分析 ##### 3.1 防止意外继承 在设计某些工具类或框架时,可能不希望这些类被继承。通过将类声明为 `final`,可以有效防止意外继承,从而确保类的行为不会被改变。 ```cpp class Utility final { // 工具类,不允许继承 public: static void helperFunction() {} }; ``` ##### 3.2 保持设计一致性 对于某些虚函数,如果希望它们在某个层次上成为最终实现,则可以将其标记为 `final`,以避免派生类对其进行不必要的修改。 ```cpp class Base { public: virtual void process() final { std::cout << "Final implementation of process" << std::endl; } }; class Derived : public Base { public: void process() override {} // 编译错误:process() 已被声明为 final }; ``` #### 4. 注意事项 - `final` 关键字只能用于类或虚函数的声明中,不能用于非虚函数或普通变量。 - 如果尝试在非虚函数上使用 `final`,会导致编译错误[^3]。 - 在多层继承中,`final` 的使用可以有效地控制继承和重写的层级关系。 #### 5. 总结 `final` 关键字在 C++ 中提供了对类继承和虚函数重写的严格控制能力。它可以帮助开发者设计更加安全和稳定的代码结构,同时避免因意外继承或重写而导致的潜在问题[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值