2014-06-10 3 views
2

Почему это работаетМножественное наследование и недоступный конструктор по умолчанию

class CL1{}; 
class CL2:private virtual CL1{}; 
class CL3:private virtual CL1{}; 

class CL4:public CL2,public CL3 
{ 
public: 
    CL4():CL2(),CL3(){} 
}; 

int main() 
{ 
    CL4 cl4; 
    return 0; 
} 

, но если я называю конструктор виртуального базового класса явно

CL4():CL1(),CL2(),CL3(){} 

, то он не работает? P.S. Компилятор: https://ideone.com/HuHlCB

+0

Вы не наследуете cl4 из cl1, так зачем вам нужно вызвать конструктор cl1? – Omid

+0

Во-первых, вы, возможно, также должны добавить точное сообщение об ошибке, которое вы получаете при компиляции – MultiVAC

+1

Частное виртуальное наследование действительно не имеет смысла (поскольку вы просто испытываете себя). –

ответ

3

CL2 и CL3 наследует CL1частной, так что все в CL1 (включая конструктор) становится частным в этих производных классах. Первый случай работает, потому что CL1::CL1() вызывается конструктором производных классов. Но вы не можете явно его называть, потому что для вашей цепочки наследования вы получаете доступ к конструктору через один из производных классов (либо CL2, либо CL3), но это private в этих классах, к ним могут обращаться только другие члены класса.

Почему это работает?

Поскольку CL2 и CL3может получить доступ к своим частным пользователям (в том числе базового класса конструкторов)

Почему Явный вызов не работает?

Поскольку CL4не может доступа CL2 's и CL3' частные члены s.

+0

Спасибо. Но не является конструктором большинства производных классов виртуального базового класса? Неявно вызвать конструктор по умолчанию, также недоступный из CL4, не так ли? Или этот случай обычен? – user3514538

+0

не является конструктором вызовов с производным классом виртуального базового класса - true, но не напрямую, через промежуточный базовый класс. «Неявно вызвать конструктор по умолчанию, также недоступный с CL4» - не уверен, что вы имели в виду. В этом случае 'CL1 :: CL1()' * неявно * вызывается из одной из базы 'CL4'. – Rakib

2

Это потому, что вы используете личное наследство от CL2/3 до CL1. Это означает, что они «реализованы в терминах«CL1, а не то, что ониCL1 (что является смыслом общественного наследования). Вы не можете преобразовать класс CL2 в CL1, и поэтому CL4 НЕ является также CL1.

Вы можете получить доступ к членам CL1 только в CL2, как если бы они были частными членами.

1

Поскольку CL4 является производным от CL3, CL2, поэтому CL1-конструктор класса CL1 не может быть явно доступен из CL4. Если бы это была функция-член, то функции-члены базового класса могут быть доступны из производного класса, конструкторы не могут, потому что CL4-класс не может быть преобразован в CL1.

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