我有一个关于在另一个构造函数的初始化列表中调用构造函数的问题。例如,在查看这样的代码时:
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
对象?
我试图在网上找到有关它的信息,但找不到任何回答我问题的信息。
问候 直播
答案 0 :(得分:1)
您似乎错过了c++
中的一些基本概念。派生类从其父类继承所有内容。它可能无法访问它。它不像“哦它是私有的,所以它不存在”。
我认为你的其他问题来自于这种错误观念。也许来自声明和定义的意思。您可以想象c++
中的派生类似于扩展基类。在记忆中,Derived
的东西有点紧贴Base
。
如果没有Derived
,Base
内容就没有意义了。它是Base
的扩展。因此,Base
类对象始终被实例化。即使派生类无法访问它。这就是为什么Base
的构造函数在构造Derived
期间被调用的原因。它总是被称为。即使没有显式,也会调用隐式构造函数。
Child
构造函数调用Parent
构造函数,不访问任何私有成员。 Parent::Parent()
确实如此。它不定义它们初始化它们,它们在Parent
类定义中定义。
此外,对象始终声明。您无法从未声明的对象派生。你也不能对未申报的对象做任何事情。所以必须声明你的Parent
,否则编译器会抛出错误。