"부모 생성자를 상속"한다는 것은 무슨 의미인지 명확하지 않습니다. 오버라이드 라는 단어를 사용하면 다형성 가상 함수처럼 동작 하는 생성자 에 대해 생각할 수 있습니다 . "가상 생성자"라는 용어는 의도적으로 사용하지 않습니다. 왜냐하면 다른 개체를 생성하기 위해 이미 존재하는 개체 인스턴스가 필요한 코드 패턴의 일반적인 이름 이기 때문 입니다 .
"가상 생성자"패턴 외부에서 다형성 생성자에 대한 유틸리티는 거의 없으며 실제 다형성 생성자가 사용될 수있는 구체적인 시나리오를 제시하기가 어렵습니다. 원격으로 유효한 C ++이 아닌 매우 고안된 예 :
struct Base {
virtual Base(unsigned p1, unsigned p2) {...}
};
struct Derived: public Base {
Derived(unsigned p1, unsigned p2) : Base(p1, p2) override {...}
};
int main(void) {
unsigned p1 = 0;
unsigned p2 = 42;
Derived *p_d1 = new Base(p1, p2); // This might call Derived(unsigned, unsigned).
Derived *p_d2 = nullptr;
p_d2 = new Base(p1, p2); // This might call Derived(unsigned, unsigned) too.
}
이 경우 호출되는 생성자는 생성되거나 할당되는 변수의 구체적인 유형에 따라 다릅니다. 구문 분석 / 코드 생성 중에 감지하는 것은 복잡하며 유틸리티가 없습니다. 구체적으로 구체적인 유형을 알고 파생 클래스에 대한 특정 생성자를 작성했습니다. 다음과 같은 유효한 C ++ 코드는 정확히 동일하고 약간 짧으며 코드의 기능이 더 명확합니다.
struct Base {
Base(unsigned p1, unsigned p2) {...}
};
struct Derived: public Base {
Derived(unsigned p1, unsigned p2) : Base(p1, p2) {...}
};
int main(void) {
unsigned p1 = 0;
unsigned p2 = 42;
Derived *p_d1 = new Derived(p1, p2);
Derived *p_d2 = nullptr;
p_d2 = new Derived(p1, p2);
}
두 번째 해석 또는 추가 질문은 기본 클래스 생성자가 명시 적으로 숨겨지지 않는 한 모든 파생 클래스에 자동으로 존재하는 경우입니다.
자식이 부모 생성자를 상속하면 무엇이 잘못 될 수 있습니까?
파생 클래스를 구성하는 데 사용되지 않는 부모 생성자를 숨기려면 추가 코드를 작성해야합니다. 파생 클래스가 특정 매개 변수와 관련이없는 방식으로 기본 클래스를 특수화 할 때 발생할 수 있습니다.
일반적인 예는 사각형과 사각형입니다 (정사각형과 사각형은 일반적으로 Liskov로 대체 할 수 없으므로 디자인이 좋지 않지만 문제를 강조합니다).
struct Rectangle {
Rectangle(unsigned width, unsigned height) {...}
};
struct Square : public Rectangle {
explicit Square(unsigned side) : Rectangle(side, side) {...}
};
Square가 Rectangle의 두 값 생성자를 상속했다면 높이와 너비가 다른 정사각형을 만들 수 있습니다 ... 논리적으로 잘못되었으므로 해당 생성자를 숨기고 싶을 것입니다.