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