题目

编写程序,演示现代 C++11 引入的两个重量级重写约束关键字:override 与 final。展示当派生类重写基类虚函数时,若因疏忽误写了参数类型(如 int 误写为 short)或漏掉了 const,override 能让编译器在编译时立即报错,杜绝因签名微小差异导致变成“同名隐藏”的灾难性隐患;同时展示 final 修饰虚函数(禁止被下游继续重写)与修饰类(禁止被继承)。

输入格式:无需外部输入。

输出格式:输出 override 确保虚函数签名严密对应与 final 拦截保护机制说明。

数据范围与约定:C++11 override 与 final 上下文关键字规范。

思路与算法

1. 重写失控的经典惨剧
在 C++03 中,若基类有 virtual void doWork(long id) const;,派生类误写成 virtual void doWork(int id) const;,编译器会认为这是一个全新的成员函数,导致动态多态彻底失效,排查难度极高。

2. override 的强制编译期断言
给派生类函数打上 override 标签后,编译器会严格在上游虚表中核验是否存在一模一样的虚函数;若找不到任何匹配签名,直接报出编译错误。

3. final 的优化与封闭
用 final 修饰类(class A final {};)可阻止任何后续继承,使编译器能够进行去虚化(Devirtualization)激进优化;修饰函数可阻断下游派生类继续覆盖该逻辑。

完整程序

#include <iostream>
#include <string>

class BaseNetworkClient {
public:
    virtual ~BaseNetworkClient() = default;

    // 基类虚函数:带 const 修饰
    virtual void connect(const std::string& host, int port) {
        std::cout << "[基类实现] 正在连接 " << host << ":" << port << "\n";
    }

    // 虚函数:带 final 限制,禁止任何子类再次重写此核心握手
    virtual void doHandshake() final {
        std::cout << "[核心安全协议] 执行不可篡改的 SSL 握手认证 (final)\n";
    }
};

class SecureNetworkClient : public BaseNetworkClient {
public:
    // 规范:显式加上 override 关键字确保签名 100% 严丝合缝
    void connect(const std::string& host, int port) override {
        std::cout << "[派生类重写] 开启 TLS 隧道连接: " << host << ":" << port << "\n";
    }

    // 若尝试在此处重写 doHandshake(),编译器会因 final 报错阻止
};

// 使用 final 封死类继承体系,禁止任何人继承 FinalEngine
class FinalEngine final {
public:
    void run() { std::cout << "FinalEngine 高性能无虚表独立引擎启动\n"; }
};

int main() {
    SecureNetworkClient client;
    BaseNetworkClient* pClient = &client;

    std::cout << "--- 1. override 确保的多态调用 ---\n";
    pClient->connect("gateway.internal", 443);

    std::cout << "\n--- 2. final 保证的不可覆盖逻辑 ---\n";
    pClient->doHandshake();

    std::cout << "\n--- 3. final 类独立测试 ---\n";
    FinalEngine engine;
    engine.run();

    return 0;
}

运行示例

输出:

--- 1. override 确保的多态调用 ---
[派生类重写] 开启 TLS 隧道连接: gateway.internal:443

--- 2. final 保证的不可覆盖逻辑 ---
[核心安全协议] 执行不可篡改的 SSL 握手认证 (final)

--- 3. final 类独立测试 ---
FinalEngine 高性能无虚表独立引擎启动