我有一个关于在另一个构造函数的初始化列表中调用构造函数的问题。例如,当看到这样的代码时:
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
,否则编译器将抛出错误。