2012-03-23 4 views
1

죄송합니다.이 질문이 이미 여러 번 요청되었지만 질문을 직접하면 정보를 빨리 찾을 수 있기를 바랍니다. 그래서 문제는 : 상속받을 가능성을 갖기 위해 수퍼 클래스에 기본 생성자를 갖는 것이 의무입니까? 파생 된 모든 클래스 생성자가 명시 적으로 수퍼 클래스 생성자 중 하나를 호출하고 올바른 매개 변수를 제공한다고 가정합니다. 이러한 코드가 작동합니까? 필요하다면 내가 말하는 내용을 명확히하기 위해 코드 스 니펫을 제공 할 수 있습니다. 미리 감사드립니다.C++ : 상속을위한 기본 수퍼 클래스 생성자가 있어야합니까?

+0

답변은 물론 다릅니다. 예를 들어 "수퍼 클래스"에 모든 종류의 데이터가 있습니까? –

+0

@ Mr Resister, 나는 당신이 상상할 수있는 가장 간단한 예를 말하고 있습니다. "그것이 달려있다"라는 것이 무엇을 의미하는지 명시 해주십시오. – Egor

+0

답변을 참조하십시오. 부모 클래스에서 초기화 할 멤버가 없으면 생성자를 전혀 작성할 필요가 없습니다. 컴파일러는 암시 적으로 기본 생성자를 만듭니다. –

답변

7

슈퍼 클래스에 기본 생성자가 있어야만 상속받을 수 있습니까?

번호는 기본 클래스의 기본 생성자가없는 경우, 당신은 파생 클래스 생성자의 멤버 초기화 목록에서 명시 적으로 인수 (들) 와 기본 클래스 생성자를 호출 할 필요가

.

class base 
{ 
    public: 
    base(std::string const & s, int n); 
}; 

class derived : public base 
{ 
    anotherClass obj; 
    public: 
    derived() : base("string", 10), obj(100) 
    {  //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ member-initialization list 
    } 
}; 

참고 base("string", 10) 구문. 기본 클래스의 생성자를 호출하고 첫 번째 인수로 "string"을 전달하고 두 번째 인수로 10을 전달합니다. obj(10)는 인수로 int 소요 anotherClass 생성자를 호출

종류별 anotherClass이다 멤버 변수를 초기화 obj(100) 알.

+2

컴파일러가 파생 클래스에 대한 기본 생성자를 자동으로 생성하지 않는다는 것을 의미합니다. 그냥 선생님. –

+1

@MatthieuM. 생성자를 제공하면 컴파일러는 자동으로 생성자를 생성하지 않습니다. 기본 클래스에 기본 생성자가없고 컴파일러에서 파생 클래스의 기본 생성자를 생성하려고하면 오류가 발생합니다. –

+2

@JamesKanze : 그렇습니다. 기본 클래스에 기본 생성자가 없으면 파생 클래스에 적어도 하나 이상의 생성자를 제공해야한다는 점을 지적하려고했습니다. –

3

  • 가 기본 생성자는 명시 적으로
  • 모든 서브 클래스가 건설에 매개 변수

쓸 의무적으로하지 않습니다와 사용자 정의 슈퍼 클래스 생성자를 호출을 호출되지 제공 기본 생성자.

2

자식 클래스의 모든 생성자가 부모의 명시 적 생성자를 사용하는 경우 부모가 기본 생성자를 가질 필요가 없습니다.

기본 생성자가없는 클래스가 있으면 인스턴스 작성시 모든 사람이 명시 적 생성자를 사용해야합니다. 맞습니까? 모든 어린이가 기본 생성자가 호출되지 않았는지 확인하면 구현하는 필요가 없습니다.

2

아니요, 한 가지 예외가 있습니다. 일반적으로 기본 클래스 생성자 은 해당 파생 클래스가 제공하는 인수를 사용하여 immediatly 위에있는 파생 클래스에 의해 호출됩니다. 모든 직접 파생 클래스가 명시 적으로 기본 클래스를 초기화하면 기본 생성자가 필요하지 않습니다.

한 가지 예외는 실제로 클래스에서 상속하는 경우입니다. 이 경우, 이 기본 클래스를 초기화하지만 가장 파생 된 클래스 인 직접 파생 클래스는 아닙니다.클래스 계층 구조가 어떻게 구성되어 있는지 에 따라 대부분 파생 클래스가 기본에 대해 알지 못하게 할 수 있습니다. 대부분의 파생 클래스가 에서 직접 상속하는 클래스에 대해서만 알고 있으면 충분합니다. (물론 이것은 이상적이며 언제나 그런 것은 아닙니다.) 운좋게도, 이런 일이 발생할 때마다 거의 기본으로 데이터가없는 추상 클래스이므로 기본 생성자가 사용됩니다. 그러나 명심해야 할 것이 있습니다.

+0

그러나 가능한 예외는 언어에 관한 한 의무가 아닙니다. 이 경우에도 언어는 기본 생성자를 갖도록 강요하지 않습니다. 그것은 클래스 계층 구조의 설계와 프로그래머 선택에 관한 것입니다. – Nawaz

+0

@Nawaz 언어는 기본 생성자를 갖도록 강요하지 않지만 기본 생성자가없는 경우 기본 클래스를 가장 파생 클래스에 알려야합니다. 아키텍처에 따라 바람직하지 않을 수 있습니다. –

0

아니요 기본 생성자가 필요하지 않습니다. 다음은 개인 Default 생성자의 유무에 관계없이 컴파일되고 실행됩니다.

class A { 
public: 

    A(int i) { 
    m = i; 
    } 

private: 

    A() { } // This line can be commented out. Included only to make point 

    int m; 
}; 

class B : A { 
public: 

    B(int i) 
    : A(i) 
    { 
    } 

}; 

int main() { 
    B b(10); 
} 
관련 문제