1

如果我运行这段代码

#include<iostream>
using namespace std;
class Final;

class MakeFinal{
public:
friend class Final;
MakeFinal(){cout<<"makefinal\n";}
};

class Final: public virtual MakeFinal{
public:
 Final(){cout<<"Final\n";}
};

 class Derived:public Final{
public:
  Derived(){cout<<"Derived\n";}
};


int main(){
//Final f;
Derived d;
return 0;
}

输出是:

makefinal 最终派生

但是如果我将 MakeFinal() 构造函数设为私有,编译器会显示错误消息。这种不同的构造函数调用层次结构基于什么?

4

2 回答 2

1

参考:

C++ 常见问题解答 - 虚拟继承构造函数 http://www.parashift.com/c++-faq/virtual-inheritance-ctors.html

因为“最派生类的ctor的初始化列表直接调用虚基类的ctor”,所以你最派生的需要直接调用虚基的构造函数。因此,对于您想要做的事情,您也需​​要将最派生的类也设为朋友...

此外,您似乎没有正确理解虚拟继承。请参阅此常见问题解答以了解虚拟继承的目的和正确使用。

于 2013-08-22T12:53:34.607 回答
1

如果你的类A有私有构造函数,你不能a像这样创建这个类的对象():

A a;

创建派生b类的对象时,还必须调用基类构造函数。如果是私有的,则无法调用,也无法创建派生对象。BA

于 2013-08-22T13:18:47.020 回答