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

在C++中模拟final类时为何使用virtual关键字?附无错示例代码

在C++中模拟final类时为何要使用virtual关键字?

要搞懂这个问题,得先明白这段代码模拟final类的核心逻辑:通过让Final类虚继承一个构造函数私有、且仅把Final设为友元的MakeFinal类,来阻止Final被其他类继承,同时保证Final自身能正常实例化。

关键原理:虚继承改变构造函数调用规则

C++中,虚基类的构造函数必须由最派生类直接调用。而普通继承时,基类的构造函数由直接子类负责调用,上层基类的构造则由子类的构造函数链式触发。

回到代码逻辑里:

  • MakeFinal的构造函数是私有状态,只有Final是它的友元,也就只有Final能直接调用它的构造函数。
  • 如果Final不用虚继承MakeFinal,那当有类Derived继承Final时,Derived的构造函数会调用Final的构造函数,而Final作为MakeFinal的友元,能正常调用MakeFinal的私有构造函数,这样Derived就能成功实例化,完全达不到“禁止继承”的目的。
  • 而用了虚继承后,要是有人尝试写class Derived : public Final,那Derived就是最派生类,必须直接调用MakeFinal的构造函数,但Derived不是MakeFinal的友元,根本访问不到这个私有构造函数,编译直接报错,完美阻止了Final被继承。

验证代码(可正常编译运行)

#include <iostream>
using namespace std;

class Final;

class MakeFinal {
private:
    MakeFinal() { cout << "MakeFinal constructor" << endl; }
    friend class Final;
};

class Final : virtual MakeFinal {
public:
    Final() { cout << "Final constructor" << endl; }
};

int main(int argc, char* argv[])
{
    Final f;
    return 0;
}

这段代码运行后会输出:

MakeFinal constructor
Final constructor

因为Final作为最派生类,有权限调用MakeFinal的私有构造函数,所以能正常创建实例。

内容的提问来源于stack exchange,提问作者Neela Krishna Teja T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:10:37