C++ Programming

C++ 다형성 다운 캐스팅 업 캐스팅

psy_er 2021. 12. 12. 01:50
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