티스토리 뷰

함수를 오버라이드할 때 자식 클래스를 반환하도록 반환형을 바꿀 수 있습니다. (포인터)

 

(스마트 포인터인 경우는 템플릿 생성자 필요)

 

  • 우주선 클래스 계층구조 (Parent -> A, B)
  • 조종사 클래스 계층구조 (Parent -> A, B)

 가 있고

  • 우주선과 조종사는 각 클래스별로 1:1 대응
  • 우주선이 조종사를 멤버로 가짐

의 관계일 때

  • 부모 우주선이 부모 조종사를 반환하는 함수를 오버라이드하여
  • 자식 우주선이 자식 조종사를 반환할 수 있습니다.

아 물론 우주선이 우주선을 반환하는 메서드도 같은 게 됩니다

최소 구성

#include <iostream>
using namespace std;

class Spaceship_Parent;
    class Spaceship_A;
    class Spaceship_B;

class Pilot_Parent {};
    class Pilot_A : public Pilot_Parent {};
    class Pilot_B : public Pilot_Parent {};

class Spaceship_Parent {
protected:
    Pilot_Parent * pilot;
public:
    virtual Pilot_Parent* getPilot() const { return pilot; }
};

class Spaceship_A : public Spaceship_Parent {
public:
    virtual Pilot_A* getPilot() const override { return reinterpret_cast<Pilot_A*>(pilot); }
};

class Spaceship_B : public Spaceship_Parent {
public:
    virtual Pilot_B* getPilot() const override { return reinterpret_cast<Pilot_B*>(pilot); }
};

int main() {
    return 0;
}

테스트용으로 변경

#include <iostream>
using namespace std;

class Spaceship_Parent;
    class Spaceship_A;
    class Spaceship_B;

class Pilot_Parent { public: virtual void whoAmI() { cout << "Pilot_Parent" << endl; } };
    class Pilot_A : public Pilot_Parent { public: virtual void whoAmI() override { cout << "Pilot_A" << endl; } };
    class Pilot_B : public Pilot_Parent { public: virtual void whoAmI() override { cout << "Pilot_B" << endl; } };

class Spaceship_Parent {
protected:
    Pilot_Parent * pilot;
public:
    virtual Pilot_Parent* getPilot() const { return pilot; }

public:
    Spaceship_Parent(): pilot(new Pilot_Parent) {}
protected:
    Spaceship_Parent(Pilot_Parent* p): pilot(p) {}
};

class Spaceship_A : public Spaceship_Parent {
public:
    virtual Pilot_A* getPilot() const override { return reinterpret_cast<Pilot_A*>(pilot); }

    Spaceship_A(): Spaceship_Parent(new Pilot_A) {}
};

class Spaceship_B : public Spaceship_Parent {
public:
    virtual Pilot_B* getPilot() const override { return reinterpret_cast<Pilot_B*>(pilot); }

    Spaceship_B(): Spaceship_Parent(new Pilot_B) {}
};

int main() {
    Spaceship_Parent* ship = new Spaceship_A();
    ship->getPilot()->whoAmI();
}

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함