2011-04-10 7 views
2

좋아요, 아주 기본적인 질문이 있습니다. 제발 쉽게가주세요.기본 생성자가 호출되는 이유는 무엇입니까?

#include<iostream>  

class base 
{ 
     public: 
      base() { std::cout << "Base()" << std::endl; } 
}; 

class derived: base { 
     public: 
      derived() { std::cout << "Derived()" << std::endl; } 
      }; 
int main() { 
derived d; 
} 

출력은 다음과 같습니다 : 다음 코드에서

자료() 파생

()

싶습니다

알고 왜의 생성자 클래스의 객체를 만들었지 만 base 클래스가 호출됩니까? FAQ에서 적절한 답을 찾을 수 없습니다.

+0

나는 [this] (http://www.desy.de/gna/html/cc/Tutorial/tutorial.html)과 같은 것을 읽음으로써 시작할 것입니다. – Mehrdad

+1

생성자의 목적은 객체를 사용할 수있게 만드는 것입니다. 당신이 기본 생성자를 호출하지 않았다면 모든 파생 클래스는 객체를 사용할 수있게 만들기 위해 모든 기본 클래스가 필요로하는 모든 설정을 수행해야합니다 ... 어느 것이 캡슐화 등으로 잘 작동하지 않습니다. – forsvarir

답변

7

base 클래스의 생성자는 derived에 포함 된 base 클래스 하위 객체를 초기화하기 위해 호출됩니다. 이것은 상속이 작동하는 방식이므로 Liskov substitution principle을 따르기가 더 쉽습니다.

class base 
{ 
public: 
    base() : x(10) { std::cout << "Base()" << std::endl; } 
private: 
    int x; 
}; 

class derived: base { 
public: 
    derived() { std::cout << "Derived()" << std::endl; } 
}; 

당신이 기본 클래스의 생성자를 호출하지 않고 회원 base::x를 초기화 할 방법 :

는 다음과 같은 고려?


그럼에도 불구하고 당신은 당신이 가상 상속를 사용할 때 수동으로 공통베이스의 생성자를 호출 할 필요가 있음을 알아 두셔야합니다.

+0

'virtual 상속 '- 그 자리를 누르십시오. – Sadique

3

Derived 개체는 Base 개체 대신 항상 사용할 수 있어야합니다. BaseBase이 제대로 초기화되어야하는 개인 멤버가있는 경우 생성자에서 수행 된 것일 수 있으므로 Base 생성자를 항상 호출해야합니다.

5

정의에 따라, 유도 대상은 입니다.

관련 문제