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 Final 派生

しかし、MakeFinal() コンストラクターを private にすると、コンパイラーにエラー メッセージが表示されます。この異なるコンストラクター呼び出し階層は何に基づいていますか?

4

2 に答える 2

1

参照する:

C++ FAQ - 仮想継承コンストラクタ http://www.parashift.com/c++-faq/virtual-inheritance-ctors.html

「最も派生したクラスの ctor の初期化リストは、仮想基本クラスの ctor を直接呼び出します。」という事実のため、最も派生したものは、仮想基本のコンストラクターを直接呼び出す必要があります。したがって、やりたいことのためには、最も派生したクラスも友達にする必要があります...

さらに、仮想継承を正しく理解していないようです。この FAQを参照して、仮想継承の目的と適切な使用法を理解してください。

于 2013-08-22T12:53:34.607 に答える