构造函数Parent在构造函数Child的初始化列表中调用

时间:2013-11-22 12:15:40

标签: c++ inheritance constructor initialization private

我有一个关于在另一个构造函数的初始化列表中调用构造函数的问题。例如,在查看这样的代码时:

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 {}  

使用第387行中调用的类Parent的构造函数:

   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的私有成员定义。由于类Child不继承类Parent的私有成员,而且在调用类Parent的构造函数时,没有声明对象/变量(参见第387行,第一个代码片段)我不知道知道调用Parent的构造函数有什么用?此外,类Parent的私有成员与类Child对象的连接是什么,它们存储在何处,因为没有声明类Parent对象? 我试图在网上找到有关它的信息,但找不到任何回答我问题的信息。

问候 直播

1 个答案:

答案 0 :(得分:1)

您似乎错过了c++中的一些基本概念。派生类从其父类继承所有内容。它可能无法访问它。它不像“哦它是私有的,所以它不存在”。

我认为你的其他问题来自于这种错误观念。也许来自声明定义的意思。您可以想象c++中的派生类似于扩展基类。在记忆中,Derived的东西有点紧贴Base

如果没有DerivedBase内容就没有意义了。它是Base的扩展。因此,Base类对象始终被实例化。即使派生类无法访问它。这就是为什么Base的构造函数在构造Derived期间被调用的原因。它总是被称为。即使没有显式,也会调用隐式构造函数。

Child构造函数调用Parent构造函数,不访问任何私有成员。 Parent::Parent()确实如此。它不定义它们初始化它们,它们在Parent类定义中定义。

此外,对象始终声明。您无法从未声明的对象派生。你也不能对未申报的对象做任何事情。所以必须声明你的Parent,否则编译器会抛出错误。