2013-08-22 1 views
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() конструктор частных , компилятор показывает сообщение об ошибке. На чем основана эта иерархия вызовов конструктора?

+0

Если конструктор базового класса является закрытым, то ничего, кроме класса друга (или самого класса), может сделать один, в том числе через наследование. –

+1

Ужасное форматирование в сторону, почему вы используете виртуальное наследование в первую очередь в этом коде? Вы понимаете, какие проблемы помогает виртуальное наследование? – thokra

ответ

1

См:

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

Из-за того, что ваши самые производные потребности, чтобы вызвать «список Инициализация CTOR наиболее производного класса непосредственно вызывает CTOR базового класса виртуальной в.» конструктор виртуальной базы. Поэтому для того, что вы хотите сделать, вам нужно будет сделать самый производный класс другом тоже ...

Кроме того, кажется, что вы не понимаете виртуального наследования правильно. Обратитесь к this FAQ, чтобы понять цель и правильное использование виртуального наследования.

1

Если ваш класс A есть приватный конструктор, вы не можете создать объект a этого класса, как, что (see):

A a; 

Когда объект b класса B, производный от A создается, конструктор базового класса также должны быть вызваны. Если он является закрытым, его нельзя вызвать, и производный объект не может быть создан.

Смежные вопросы