728x90
C++ 다형성 다운 캐스팅 업 캐스팅
<다형성 업 캐스팅 다운 캐스팅>
부모 클래스의 포인터/레퍼런스 형으로만 자식 객체를 업 캐스팅할 수 있다.
Person* pPerson = new UnivStudent;
UnivStudent* pStud = (UnivStudent*)pPerson;
<dynamic_cast 객체 타입>
dynamic_cast <type-id*>(exp)를 사용해 객체의 타입을 알아본다.
가상 함수 선언은 필수이고, 부모 소멸자를 가상 함수 virtual로 만드는 것이 일반적이다.
-type-id* 포인터로 다운 캐스팅 타입을 지정한다,
-exp 표현식 type-id를 포인터형으로 객체 주소 값을 반환한다.
int main(){
Person* list[2]; // 객체 포인터 배열을 활용한다.
list[0] = new Person();
list[1] = new UnivStudent();
UnivStudent* us;
for(int i=0; i<2; i++){
list[i]->WhoAreYou();
us = dynamic_cast<UnivStudent*>(list[i]);
if(us != NULL)
cout << us->GetMajor() << endl;
}
<다운 캐스팅 사용>
1. 추가 메서드에 접근하기 위해 다운 캐스팅한다.
// 추가 메서드에 접근하기 위해 다운 캐스팅
UnivStudent* pStud;
pStud = (UnivStudent*)pPerson;
pStud->WhoAreYou();
((UnivStudent*)pPerson)->WhoAreYou();
2. 재정의 된 자식 멤버에 접근하기 위해서 다운 캐스팅
재정의 가능성이 있는 함수는 가상함수(virtual)로 만들어두면 다운 캐스팅할 필요가 없다.
class Person{
int age;
char* name;
public:
Person(const char* name, int age);
virtual ~Person();
};
inline Person::~Person(){
cout<< "~Person()" << endl;
delete [] name; // 소멸자에서 동적할당 해제
}
728x90
'C++ Programming' 카테고리의 다른 글
C++ iterator 반복자 STL sort 알고리즘 (1) | 2021.12.16 |
---|---|
C++ 제네릭 템플릿 클래스 (0) | 2021.12.14 |
C++ 부모 자식 상속 (0) | 2021.12.10 |
[ C++ ] 레퍼런스 Reference 캡슐화 Encapsulation 정보은닉 Private (1) | 2021.11.08 |
[ C++ ] Class 클래스 정의와 객체 선언 (2) | 2021.11.07 |