我试图理解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为类(和虚函数)引入了关键字.
| 归档时间: |
|
| 查看次数: |
1706 次 |
| 最近记录: |