공변 반환 타입을 설명할 땐 가상 생성자를 같이 설명하는 것이 빠르다.
다음 내용을 참고하였다.
C++은 문법적으로 가상 생성자를 지원하지 않지만, 다음과 같은 편법(?)을 이용해 가상 생성자의 구현이 가능하며, 이러한 방식을 보통 C++의 가상 생성자라고 칭한다.
Clone() 함수(복사생성자 대신)와, Create() 함수(생성자 대신)를 사용한다.
이후, 해당 Clone() 함수와 Create() 함수를 다음과 같이 가상 생성자처럼 활용하면 된다.
여기서 Circle 클래스의 Clone() 과 Create() 오버라이딩 함수를 보면 리턴 타입이 Shape* 가 아닌 Circle* 임을 알 수 있다.
이것을 공변 반환 타입(Covariant Return Types)이라고 칭하는데, 다음의 조건을 만족하여야 한다.
1. 리턴 타입이 참조형(&)이나 포인터형(*) 이다.
2. A<-B 의 관계에서 오버라이딩 당하는 함수가 기반 클래스에서 A* 또는 A& 를 리턴해야 한다.
3. A<-B 의 관계에서 오버라이딩 하는 함수가 하위 클래스에서 B* 또는 B& 를 리턴해야 한다
다음 내용을 참고하였다.
C++은 문법적으로 가상 생성자를 지원하지 않지만, 다음과 같은 편법(?)을 이용해 가상 생성자의 구현이 가능하며, 이러한 방식을 보통 C++의 가상 생성자라고 칭한다.
Clone() 함수(복사생성자 대신)와, Create() 함수(생성자 대신)를 사용한다.
class Shape {
public:
virtual ~Shape() { } // A virtual destructor
virtual void Draw() = 0; // A pure virtual function
virtual void Move() = 0;
...
virtual Shape* Clone() const = 0; // Uses the copy constructor
virtual Shape* Create() const = 0; // Uses the default constructor
};
class Circle : public Shape {
public:
Circle* Clone() const; // Covariant Return Types; see below
Circle* Create() const; // Covariant Return Types; see below
...
};
Circle* Circle::Clone() const { return new Circle(*this); }
Circle* Circle::Create() const { return new Circle(); }
이후, 해당 Clone() 함수와 Create() 함수를 다음과 같이 가상 생성자처럼 활용하면 된다.
void userCode(Shape& s)
{
Shape* s2 = s.clone();
Shape* s3 = s.create();
...
delete s2;
delete s3;
}
여기서 Circle 클래스의 Clone() 과 Create() 오버라이딩 함수를 보면 리턴 타입이 Shape* 가 아닌 Circle* 임을 알 수 있다.
이것을 공변 반환 타입(Covariant Return Types)이라고 칭하는데, 다음의 조건을 만족하여야 한다.
1. 리턴 타입이 참조형(&)이나 포인터형(*) 이다.
2. A<-B 의 관계에서 오버라이딩 당하는 함수가 기반 클래스에서 A* 또는 A& 를 리턴해야 한다.
3. A<-B 의 관계에서 오버라이딩 하는 함수가 하위 클래스에서 B* 또는 B& 를 리턴해야 한다
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST





