0

가능한 중복 :

C ++ 수퍼 클래스 생성자 호출 규칙

어떻게 슈퍼 클래스의 생성자에게 작업을 위임합니까? 예를 들어

class Super {
public:
    int x, y;
    Super() {x = y = 100;}
};
class Sub : public Super {
public:
    float z;
    Sub() {z = 2.5;}
};

어떻게 내가 가질까Sub::Sub()전화 걸기Super::Super()그래서 나는 설정할 필요가 없다.xy두 생성자 모두에서?


2 답변


5

생성자의 멤버 초기화 자 목록 사용 :

class Super {
public:
    int x, y;
    Super() : x(100), y(100)  // initialize x and y to 100
    {
       // that was assignment, not initialization
       // x = y = 100;
    }
};
class Sub : public Super {
public:
    float z;
    Sub() : z(2.5) { }
};

명시 적으로 기본 클래스 '를 호출 할 필요가 없습니다.태만생성자는 파생 클래스 '생성자가 실행되기 전에 자동으로 호출됩니다.

반면에 기본 클래스가 매개 변수로 생성되도록하려는 경우 (그러한 생성자가있는 경우)필요한 것그것을 부른다 :

class Super {
public:
    int x, y;
    explicit Super(int i) : x(i), y(i)  // initialize x and y to i
    { }
};
class Sub : public Super {
public:
    float z;
    Sub() : Super(100), z(2.5) { }
};

또한,불릴 수있다.arguments 없이는 기본 생성자이기도합니다. 그래서 당신은 이것을 할 수 있습니다 :

class Super {
public:
    int x, y;
    explicit Super(int i = 100) : x(i), y(i)
    { }
};
class Sub : public Super {
public:
    float z;
    Sub() : Super(42), z(2.5) { }
};
class AnotherSub : public {
public:
    AnotherSub() { }
    // this constructor could be even left out completely, the compiler generated
    // one will do the right thing
};

기본 멤버를 기본값으로 초기화하지 않으려는 경우에만 명시 적으로 호출하십시오.

희망이 도움이됩니다.


1

에있는 기본 생성자를 호출하십시오.member initialize list원하는 경우 실제로는 Super () 생성자가 자동으로 호출됩니다.

슈퍼 소멸자 가상을 만드는 것을 잊지 마십시오.

class Super {
public:
    int x, y;
    Super() : x(100),y(100) {}
    virtual ~Super(){}
};

Super에 대한 포인터를 통한 삭제가 허용되어야한다면, Super Destructor는 public과 virtual이어야한다.


  • Super () 생성자가 자동으로 호출됩니다 (명시 적으로 호출 할 필요가 없음). 오직 가상 클래스 멤버가 없기 때문에이 클래스가 다형 기본 타입이 될 경우에만 Super 클래스 소멸자를 가상으로 만들어야합니다. - Martin York
  • 당신이~ 할 필요가 없다.이 경우에는 컴파일러에 의해 암시 적으로 호출되므로 기본 생성자를 호출하십시오. 명시 적으로 나열하면됩니다.기본값이 아닌생성자 (인수 전달). Loki는 소멸자를 다형성으로 만들기를 항상 원하지 않는다는 점에서 옳다. - David Rodríguez - dribeas
  • 전에 공백을 추가하십시오.: Super()... - Potatoswatter
  • 제발, 다른 하나 upvote,이 하나가 아니라, 다음 답변은 내보다 더 많은 정보를 캡처합니다. - billz

연결된 질문


관련된 질문

최근 질문