2013-11-22 4 views
0

다른 생성자의 초기화 목록에서 생성자를 호출하는 것에 대한 질문이 있습니다. 예를 들어 다음과 같은 코드를 볼 때 : 라인 387에 전화 클래스 Parent의 생성자생성자 부모 생성자의 초기화 목록에서 호출 됨 자식

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

:

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의 개인 멤버가 정의됩니다. 클래스 ChildParent 클래스의 private 멤버를 상속하지 않으며, Parent 클래스의 생성자를 호출 할 때 객체/변수가 선언되지 않았기 때문에 (라인 387, 첫 번째 코드 스 니펫 참조) 나는 Parent의 생성자를 호출하는 것이 무엇인지 잘 모릅니다. 더군다나 클래스 Child에 대한 클래스 Parent의 개인 멤버와 어떤 클래스가 연결되어 있으며 클래스가 없기 때문에 어떤 객체가 저장되어 있습니까? Parent 객체가 선언 되었습니까? 인터넷에서 정보를 찾으려고했지만 내 질문에 답할 수있는 정보가 없습니다.

인사 streight는

+0

'Library :: Child :: Child'는 기본 클래스'Library :: Parent :: Parent'의 파생 클래스입니다. ?? ('Base'와 'Derived'라는 단어는 사실이 경우이 질문을 상당히 쉽게 따르게 할 것입니다.) – WhozCraig

+0

@WhozCraig : 예, 클래스'Child'는 클래스'Parent'에서 파생되었습니다. 나는 이것이 '부모'로부터 직접 상속되기 때문에 이것은 또한 이해하기 쉽고 정확한 경우라고 생각한다.참고 :'Library :: Child :: Child'는 클래스가 아닌 생성자입니다. 그러나 이것을 알고 계실 것입니다. – Streight

답변

1

당신은 c++ 몇 가지 기본 개념을 missunderstand 것으로 보인다. 파생 클래스는 상위 클래스에서 모든 것을 상속받습니다. 액세스 권한이 없을 수도 있습니다. 그것은 "오하이오 개인이 아니기 때문에 존재하지 않습니다"와 같은 것이 아닙니다.

본인의 나머지 문제는이 오해에서 비롯된 것이라고 생각합니다. 그리고 어쩌면 선언에서정의을 의미 할 수 있습니다. c++에서 기본 클래스를 확장하는 것과 같은 파생을 상상할 수 있습니다. 메모리에 Derived 물건은 다소 Base에 붙어 있습니다.

DerivedBase이없는 경우 의미가 없습니다. Base의 확장입니다. 따라서 Base 클래스 개체는 항상 인스턴스화됩니다. 파생 클래스에 액세스 할 수없는 경우에도 마찬가지입니다. 그래서 Derived의 생성 중에 Base의 생성자가 호출됩니다. 항상 부름받습니다. 명시 적으로 아니더라도 암시 적으로 기본 생성자가 호출됩니다.

Child 생성자는 Parent 생성자를 호출하며 모든 비공개 멤버에 액세스하지 않습니다. Parent::Parent()입니다. 으로 정의되어 있지 않습니다. 으로 초기화되었으며 Parent 클래스 정의로 정의됩니다.

또한 개체는 이고 항상입니다. 선언되지 않은 객체에서 파생 될 수 없습니다. 선언되지 않은 객체로 무엇이든 할 수 없습니다. 따라서 Parent을 선언해야합니다. 그렇지 않으면 컴파일러에서 오류가 발생합니다.

+0

고마워, 나는 정말로 상속 개념을 조금 잘못 이해했다. 그래서, 당신이 옳은 것을 이해한다면'derived '클래스의 객체를 생성하기 위해'derived'의 모든 부모 클래스 생성자가'derived'의 생성자를 호출하기 전에 호출됩니다. '파생 된 '개체는 모든 부모와 그 구성원의 모든 구성원으로 구성되지만 클래스의 개인 구성원에 대한 액세스는 각 클래스 구성원으로 제한됩니다. 맞습니까? 따라서 제 경우 클래스'Child'의 객체는'Parent' 클래스의 privare 멤버를 가지고 있습니다. 단지'Child' 클래스의 멤버 만 접근 할 수 없습니다. – Streight

+1

@Streight Right. 또한 * 멤버 *는 일반적으로 클래스의 변수를 의미하며, 함수는 * 메소드 *라고합니다. 그래서 회원들은 보통 다른 회원에게 아무 것도하지 않으므로 다른 회원에게 접근하지 못하지만 방법은 그들을 조작합니다. – luk32

+0

나는 둘 다 클래스의 멤버이기 때문에 membervariables와 membermethods를 선호합니다. 따라서 membermethods는 membervariables 등에 액세스 할 수 있습니다. – Streight

관련 문제