我有一个关于在另一个构造函数的初始化列表中调用构造函数的问题。例如,当查看这样的代码时:
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
。
如果没有 Base
,Derived
内容将毫无意义。它是 Base
的扩展。因此,Base
类对象始终被实例化。即使派生类无法访问它。这就是为什么 Base
的构造函数在 Derived
的构造过程中被调用的原因。它总是被调用。即使没有显式地调用,也会调用隐式的默认构造函数。
Child
构造函数调用Parent
构造函数,并且不访问任何私有(private)成员。 Parent::Parent()
可以。它没有定义它们,而是初始化它们,它们在Parent
类定义中定义。
对象也总是声明。您不能从未声明的对象派生。你也不能对未声明的对象做任何事情。所以你的 Parent
必须声明,否则编译器会抛出错误。
关于c++ - 构造函数 Parent 在构造函数 Child 的初始化列表中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20144706/