2013-11-22 44 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

相關問題