You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++11之前如何实现final语义,限制类继承与虚函数重写?

C++11前实现类似final的约束方法

在C++11引入final之前,要实现阻止类被继承或虚函数被重写的效果,主要靠以下两种经典技巧:

一、阻止类被继承

核心思路是让派生类无法调用基类的构造函数,最常用的方式是将基类的所有构造函数设为私有,同时提供静态工厂方法创建对象:

class NonInheritable {
private:
    // 把所有构造函数设为私有,派生类无法访问
    NonInheritable() = default;
    NonInheritable(const NonInheritable&) = default;
public:
    // 静态工厂方法用于创建栈实例
    static NonInheritable createInstance() {
        return NonInheritable();
    }

    // 堆分配的工厂方法
    static NonInheritable* createHeapInstance() {
        return new NonInheritable();
    }
};

当其他类尝试继承NonInheritable时,编译阶段就会报错——因为派生类的构造函数必须调用基类的构造函数,而基类构造是私有的,无法访问。

二、阻止虚函数被重写

最可靠的方式是使用非虚接口(NVI)模式:将虚函数设为私有,对外暴露公共的非虚函数作为接口,派生类无法重写私有虚函数,自然也就无法修改原本的逻辑:

class Base {
private:
    // 私有虚函数,派生类无法重写
    virtual void internalDoWork() {
        // 核心逻辑实现
    }
public:
    // 公共非虚接口,供外部调用
    void doWork() {
        // 可在此添加统一的前置/后置处理(如日志、校验)
        internalDoWork();
    }
};

class Derived : public Base {
    // 此处无法重写internalDoWork,因为它是Base的私有成员
};

这种方式不仅能阻止重写,还能在公共接口中统一添加通用逻辑,是一种兼顾约束和扩展性的设计模式。

内容的提问来源于stack exchange,提问作者Gegham Chinaryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 22:11:05