Конструктор Parent вызван в списке инициализации конструктора Child

0

У меня вопрос о вызове конструктора в списке инициализации другого конструктора. Например, когда вы смотрите на такой код:

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? Я пытался найти информацию об этом в сети, но не смог найти ничего, что отвечало бы на мои вопросы.

Приветствие

  • 0
    Library::Child::Child является производным классом от базового класса Library::Parent::Parent ?? (Слова Base и Derived значительно облегчили бы этот вопрос, если бы это действительно так).
  • 0
    @WhozCraig Да, класс Child является производным от класса Parent . Я думаю, что это также очень легко понять и в этом случае точно, так как Child наследует непосредственно от Parent . Примечание: Library::Child::Child - конструктор, а не класс, но я уверен, что вы это знаете.
Теги:
initialization
inheritance
constructor
private

1 ответ

1
Лучший ответ

Кажется, вы пропустили понимание некоторых базовых понятий в c++. Производный класс наследует все от своего родительского класса. Возможно, у него нет доступа к нему. Это не похоже на "его личное, так что его нет".

Я думаю, что остальная часть ваших проблем исходит из этого промаха. И, может быть, из того, что означает декларация и определение. Вы можете представить вывод в c++ как расширение базового класса. В памяти материал Derived похож на Base.

Derived материал не имел бы смысла, если бы Base не присутствовала. Это расширение для Base. Таким образом, объект Base класса всегда создается. Даже если производный класс не имеет к нему доступа. Вот почему конструктор Base вызывается во время построения Derived. Он всегда называется. Даже если это явно не указано, будет вызываться неявный конструктор по умолчанию.

Конструктор Child вызывает Parent конструктор и не имеет доступа к каким-либо частным членам. Parent::Parent() делает. Он не определяет их инициализацию, они определены в определении Parent класса.

Также объекты всегда объявляются. Вы не можете получить из необъявленного объекта. И вы не можете ничего сделать с необъявленным объектом. Поэтому ваш Parent должен быть объявлен, иначе компилятор выкинет ошибку.

  • 0
    Спасибо, я действительно немного неправильно понял концепцию наследования. Итак, если я правильно Вас понял, для построения объекта класса , derived для всех родительских классов конструкторов derived называются перед вызовом конструктора derived . Объект , derived состоит из всех членов всех родителей плюс своих членов, но доступ к закрытым членам классов ограничен соответствующим членам класса, не так ли? Поэтому в моем случае объект класса Child имеет привилегированных членов класса Parent , только члены класса Child имеют к ним доступа.
  • 1
    @ Правильно. Также члены обычно означают переменные в классе, функции называются методами . Поэтому участники обычно ничего не делают с другими участниками, поэтому они не имеют доступа к другим членам, но методы работают с ними.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню