2013-11-22 43 views
0

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

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 {} 

Parent类的构造称为线387:

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

+0

'Library :: Child :: Child'是基类'Library :: Parent :: Parent'的派生类? (如果事实上是这样的话,“Base”和“Derived”这两个词就会使这个问题更容易遵循)。 – WhozCraig

+0

@WhozCraig:是的,“Child”类是从“Parent”类派生的。我认为这也很容易理解,并且在这种情况下是准确的,因为'Child'直接从'Parent'继承。注意:'Library :: Child :: Child'是构造函数,而不是类,但我相信你知道这一点。 – Streight

回答

1

你似乎missunderstand在c++一些基本概念。派生类继承其父类的所有内容。它可能无法访问它。它不像“它的私人,所以它不存在”。

我认为你的其他问题来自这种误解。也许从声明定义的意思。你可以想像c++中的派生类似扩展基类。在内存中Derived的东西是有点粘在Base

如果没有Base存在,Derived的东西将没有意义。它是Base的扩展。因此,Base类对象总是被实例化。即使派生类没有访问权限。这就是为什么在建造Derived期间调用Base的构造函数。它总是被称为。即使不明确,隐式默认的构造函数也会被调用。

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

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

+0

谢谢,我真的有点误解了继承概念。所以,如果我理解你是正确的,为了构造派生类的对象,在调用derived的构造函数之前调用derived的所有父类构造函数。 “派生”的对象由所有父母的所有成员加上其自己的成员组成,但是对班级的私人成员的访问仅限于相应的班级成员,对吗?因此,在我的情况下,类“Child”的对象拥有类“Parent”的私有成员,只是类Child的成员无法访问它们。 – Streight

+1

@Streight权利。另外*成员*通常表示类中的变量,函数称为*方法*。所以成员通常不会对其他成员做任何事情,所以他们不会访问其他成员,但方法确实对其他成员进行操作。 – luk32

+0

我喜欢说成员变量和成员方法,因为他们都是类的成员。因此membermethods可以访问成员变量等。 – Streight

相关问题