具有公共/私有构造函数的虚拟基类行为差异

时间:2013-08-22 11:26:30

标签: c++ compiler-construction constructor

如果我运行此代码

#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()构造函数设为私有,则编译器会显示错误消息。什么是基于?

的不同构造函数调用层次结构

2 个答案:

答案 0 :(得分:1)

参考:

C++ FAQs - virtual inheritance constructors http://www.parashift.com/c++-faq/virtual-inheritance-ctors.html

由于&#34;大多数派生类的ctor的初始化列表直接调用虚拟基类的ctor。 &#34;,您最需要直接调用虚拟基础的构造函数。因此,对于你想要做的事情,你也需要让最派生的阶级成为朋友......

此外,您似乎无法正确理解虚拟继承。请参阅this FAQ以了解虚拟继承的目的和正确用法。

答案 1 :(得分:1)

如果您的班级A有私有构造函数,则无法像这样(see)创建此类的对象a

A a;

当创建派生自b的类B的对象A时,还必须调用基类构造函数。如果它是私有的,则无法调用它,并且无法创建派生对象。