构造函数子级的初始化列表中调用了构造函数父级



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

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

问候streight

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

我想你剩下的问题都来自于这个错误的概念。也许来自声明定义的意思。您可以想象c++中的派生类似于扩展基类。在存储器中,Derived的东西有点粘在Base上。

如果不存在CCD_ 18,则CCD_。它是Base的扩展。因此,Base类对象总是被实例化的。即使派生类无法访问它。这就是为什么在构造Derived时调用Base的构造函数。它总是被调用。即使没有显式调用,也会调用隐式默认构造函数。

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

对象也是始终声明的。不能从未声明的对象派生。也不能对未声明的对象执行任何操作。所以必须声明Parent,否则编译器将抛出错误。

最新更新