У меня вопрос о вызове конструктора в списке инициализации другого конструктора. Например, когда вы смотрите на такой код:
Library::Child::Child
380 (
381 const word& controlName,
382 const argList& args,
383 const word& systemName,
384 const word& constantName
385 )
386 :
387 Parent
388 (
389 args.rootPath(),
390 args.caseName(),
391 systemName,
392 constantName
394 )
395 {}
с конструктором класса Parent
указанным в строке 387:
30 Library::Parent::Parent
31 (
32 const fileName& rootPath,
33 const fileName& caseName,
34 const word& systemName,
35 const word& constantName
36 )
37 :
38 processorCase_(caseName.find("processor") != string::npos), //private member
39 rootPath_(rootPath), //private member
40 case_(caseName), //private member
41 system_(systemName), //private member
42 constant_(constantName) //private member
43 {}
Основной объект, построенный, относится к типу/классу Library::Child::Child
, но при конструировании этого объекта также определяется конструктор Library::Parent::Parent
Parent
класса Parent
и определены частные члены класса Parent
. Поскольку класс Child
не наследует частный член класса Parent
и, кроме того, при вызове конструктора класса Parent
не объявляется объект/переменная (см. Строку 387, первый фрагмент кода). Я не знаю, для чего полезно использовать конструктор Parent
Кроме того, в чем связаны частные члены класса Parent
с объектом класса Child
и где они хранятся, поскольку не объявлен объект класса Parent
? Я пытался найти информацию об этом в сети, но не смог найти ничего, что отвечало бы на мои вопросы.
Приветствие
Кажется, вы пропустили понимание некоторых базовых понятий в c++
. Производный класс наследует все от своего родительского класса. Возможно, у него нет доступа к нему. Это не похоже на "его личное, так что его нет".
Я думаю, что остальная часть ваших проблем исходит из этого промаха. И, может быть, из того, что означает декларация и определение. Вы можете представить вывод в c++
как расширение базового класса. В памяти материал Derived
похож на Base
.
Derived
материал не имел бы смысла, если бы Base
не присутствовала. Это расширение для Base
. Таким образом, объект Base
класса всегда создается. Даже если производный класс не имеет к нему доступа. Вот почему конструктор Base
вызывается во время построения Derived
. Он всегда называется. Даже если это явно не указано, будет вызываться неявный конструктор по умолчанию.
Конструктор Child
вызывает Parent
конструктор и не имеет доступа к каким-либо частным членам. Parent::Parent()
делает. Он не определяет их инициализацию, они определены в определении Parent
класса.
Также объекты всегда объявляются. Вы не можете получить из необъявленного объекта. И вы не можете ничего сделать с необъявленным объектом. Поэтому ваш Parent
должен быть объявлен, иначе компилятор выкинет ошибку.
derived
для всех родительских классов конструкторов derived
называются перед вызовом конструктора derived
. Объект , derived
состоит из всех членов всех родителей плюс своих членов, но доступ к закрытым членам классов ограничен соответствующим членам класса, не так ли? Поэтому в моем случае объект класса Child
имеет привилегированных членов класса Parent
, только члены класса Child
имеют к ним доступа.
Library::Child::Child
является производным классом от базового классаLibrary::Parent::Parent
?? (СловаBase
иDerived
значительно облегчили бы этот вопрос, если бы это действительно так).Child
является производным от классаParent
. Я думаю, что это также очень легко понять и в этом случае точно, так какChild
наследует непосредственно отParent
. Примечание:Library::Child::Child
- конструктор, а не класс, но я уверен, что вы это знаете.