- 공변 반환 규칙 ( covariant return rule )

class Parent
{
public:
    virtual Parent* Clone() const { return new Parent(); }
};

class Child : public Parent
{
public:
    virtual Child* Clone() const { return new Chid(); }
};

이렇게 리턴값이 달라도 오버라이딩이 된다.

파생 클래스에서 오버라이드하는 함수의 타입은 기본클래스의 그 가상 함수의 타입과 같아야 한다. 단, 반환 타입 하나는 예외이다. C++에서는 원래의 반환 타입이 B*일 때 파생 클래스 쪽에서 오버라이드한 함수의 반환 타입이 D*이면 문제가 없다. 단, 여기에도 단서가 하나 붙는데 B는 D의 public기본 클래스여야 한다. ( B&, D&까지 허용된다.)
그러나 인자 타입에 대해서는 통하지 않는다.

출처 :  The C++ Programming Language ( p568 ~ 569 )

- 가상 상속 ( virtual inheritance )

class Storable { ... };
class Transmitter : public virtual Storable { ... };
class Receiver : public virtual Storable { ... };
class Radio : public Transmitter, public Receiver { ... };

 다중상속시 문제가 되는건 마름모( or 다이아몬드 )상속이다. goto문처럼 마름모상속은
죄악으로 여겨지기때문에 쓰게 되는 일이 거의 전무하다. 게다가 예전 책들중에 virtual 상속이란게 있다는걸 알려준 책도 없었다. 쓰지 말아야할 이유가 잔뜩...

 이것에 면죄부(?)를 주는 방식으로 기본클래스가 중복되는것을 방지해주는 방법
( 근데..쓸일 있을까...일단 뭔가 무서워...;;; )

출처 :  The C++ Programming Language 15.2.4( p533 )

ps..
TC++PL 이 몰랐던 사실들을 많이 알려줘서 좋긴한데...
가끔 뭐였지 뭐였지 하면서 막상 찾으려하면 찾기가 불편해서  답답함...;
Posted by 자갈공명 zagalnet

댓글을 달아 주세요