c ++中的"final"类实现

pja*_*ain 6 c++

我试图理解cpp中"final"的实现代码:

以下是代码:

/* A program with compilation error to demonstrate that Final class cannot
   be inherited */

class Final;  // The class to be made final

class MakeFinal // used to make the Final class final
{
private:
    MakeFinal() { cout << "MakFinal constructor" << endl; }
friend class Final;
};

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

class Derived : public Final // Compiler error
{
public:
    Derived() { cout << "Derived constructor" << endl; }
};

int main(int argc, char *argv[])
{
    Derived d;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:编译器错误

In constructor 'Derived::Derived()':
error: 'MakeFinal::MakeFinal()' is private
Run Code Online (Sandbox Code Playgroud)

在这里,我无法理解虚拟继承MakeFinal类的逻辑.我们可以简单地将它继承(makeFinal类)作为公共,甚至在这种情况下我们将无法继续继承它(因为Makefile的构造函数是私有的,只有Final类可以访问它的朋友).

任何指针?

Rei*_*ica 11

它不会起作用.非虚基类始终由类立即初始化,该类立即从它们派生.也就是说,如果方案如下:

class Final : public MakeFinal
{
public:
  Final() {}
};

class Derived : public Final
{};
Run Code Online (Sandbox Code Playgroud)

然后Derived只有初始化的ctor Final,这很好(Final有一个公共ctor).Final然后MakeFinal,ctor然后初始化,这也是可能的,因为Final是朋友.

但是,对于虚拟基类,规则是不同的.所有虚拟基类都由最派生对象的ctor初始化.也就是说,在创建一个实例时Final,它是Final初始化的ctor MakeFinal.但是,在尝试创建实例时Derived,它必须是Derived初始化的MakeFinal.这是不可能的,因为MakeFinal私人ctor.

另请注意,C++ 11 final为类(和虚函数)引入了关键字.