티스토리 뷰
함수를 오버라이드할 때 자식 클래스를 반환하도록 반환형을 바꿀 수 있습니다. (포인터)
- 우주선 클래스 계층구조 (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
링크
TAG
- 오라클 클라우드
- scss
- exercism
- OStatus
- Godot Engine
- 토이프로젝트
- 왜 생각이 안 났지
- ActivityPub
- 쿠버네티스
- Sass
- 오라클 클라우드 인프라
- Oracle Cloud Infrastructure
- ArchLinuxARM
- mvu
- C#
- C++ FAQ
- pdf.js
- 시스어드민
- vuex
- kotlin당했다
- javascript
- 개발기록
- 마스토돈
- gitea
- pleroma
- rust-lang
- c++
- upbit
- 업비트
- K8s
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함