我试图理解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类可以访问它的朋友)。
任何指针??
答案 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
。