태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
공변 반환 타입을 설명할 땐 가상 생성자를 같이 설명하는 것이 빠르다.
다음 내용을 참고하였다.
 
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& 를 리턴해야 한다

 
저작자 표시 비영리 변경 금지
Creative Commons License
Creative Commons License
http://www.iamscavenger.com/trackback/133 관련글 쓰기
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST