c ++中的“final”类实现

时间:2013-06-19 06:43:25

标签: 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;
}

输出:编译器错误

In constructor 'Derived::Derived()':
error: 'MakeFinal::MakeFinal()' is private

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

任何指针??

1 个答案:

答案 0 :(得分:11)

这不行。非虚基类始终由类立即初始化,该类立即从它们派生。也就是说,如果情景如下:

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

class Derived : public Final
{};

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

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

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