只谈C++11新特性 - final 说明符

final 说明符

背景问题

在 C++11 之前,C++ 语言对继承和虚函数的使用提供了极大的灵活性,但也因此引入了一些潜在的问题。以下是两个主要问题:

  1. 虚函数被错误重写
    在派生类中,可能意外地对基类中的虚函数进行错误的重写导致代码逻辑和设计意图不一致。这种错误通常难以被及时发现,可能会导致运行时行为与预期不符。

  2. 继承的滥用
    有些类被设计为不希望被继承,但 C++11 之前没有直接的语言支持来禁止继承,开发者只能通过使用私有构造函数等方式间接实现。

示例代码说明问题

问题 1:虚函数错误重写
#include <iostream>

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;
    }
};

int main() {
    Base* obj = new Derived();
    obj->display(); // 调用的是 Derived::display
    delete obj;
    return 0;
}
问题 2:类被错误继承
class NonInheritable {
protected:
    NonInheritable() = default;
};

class Derived : public NonInheritable {
    // 尽管设计上不希望被继承,仍然可以通过其他方法绕过限制
};

引入 final 的解决方案

C++11 引入了 final 说明符,专门用来解决上述问题。

  1. 防止虚函数被重写:在虚函数声明后添加 final,禁止派生类进一步重写该函数。
  2. 防止类被继承:在类名后添加 final,禁止其他类继承该类。

使用示例

示例 1:禁止虚函数重写

#include <iostream>

class Base {
public:
    virtual void display() const final { // 禁止派生类重写
        std::cout << "Base::display" << std::endl;
    }
};

class Derived : public Base {
public:
    // void display() const override; // 编译错误:Base::display 被标记为 final
};

int main() {
    Base* obj = new Derived();
    obj->display();
    delete obj;
    return 0;
}

示例 2:禁止类继承

class NonInheritable final {
public:
    void show() const {
        // 实现逻辑
    }
};

// class Derived : public NonInheritable {}; // 编译错误:NonInheritable 被标记为 final

总结

C++11 的 final 说明符解决了虚函数被意外重写和类被错误继承的问题,提高了代码的安全性和可读性。在实际开发中,合理使用 final 可以避免许多潜在的逻辑错误和设计上的误解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值