在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
相关产品推荐
相关产品推荐

