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

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

问候 直

最佳答案

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

我认为您的其他问题都来自这种误解。也可能来自声明定义 的意思。您可以想象 c++ 中的派生就像扩展基类一样。在内存中,Derived 内容有点粘附到 Base

如果没有 BaseDerived 内容将毫无意义。它是 Base 的扩展。因此,Base 类对象始终被实例化。即使派生类无法访问它。这就是为什么 Base 的构造函数在 Derived 的构造过程中被调用的原因。它总是被调用。即使没有显式地调用,也会调用隐式的默认构造函数。

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

对象也总是声明。您不能从未声明的对象派生。你也不能对未声明的对象做任何事情。所以你的 Parent 必须声明,否则编译器会抛出错误。

关于c++ - 构造函数 Parent 在构造函数 Child 的初始化列表中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20144706/

相关文章:

c++ - 灰度平均滤波Opencv

c++ - 如何强制库在qt creator中静态链接

java - 如何在执行操作时从操作中获取请求参数

c++ - 用于可变参数模板实例化的 boost::hana 元组解包

c++ - std::vector 中非整数元素的总和

PHP:如何从当前类中使用的特征方法调用父方法?

C# 脚本(子对象)不允许我访问另一个脚本(这是父对象)统一

java - 我应该在声明时还是在构造函数中实例化实例变量?

java - 子类构造函数不被识别

c++ - 我需要销毁新类的每个实例吗?