새소식

💻 Programming (프로그래밍)/C++

[C++] 업캐스팅(Up Casting), 다운캐스팅(Down Casting) 이란?

  • -

업캐스팅

부모 클래스를 통해 자식 클래스를 다루는 행위

#include <iostream>
using namespace std;

class Animal {
public:
	virtual void cry() { cout << "Crrr" << endl; }
};

class Dog : public Animal {
public:
	virtual void cry() { cout << "Mung" << endl; }
};

void foo(Animal* p) {
	p->cry();
}

int main() 
{
	Animal a;
	Dog d;

	foo(&a);
	foo(&d);
}
// 실행 결과 
/* 
Crrr
Mung
*/

 

virtual function (가상함수) 를 통해 부모에서 자식까지 타고타고 들어가 Dog -> cry() 까지 실행시켜줍니다.

 

즉 foo(&d) 실행시

foo(Animal* p = &d)

 

p->cry()

p-> cry(어! virtual 함수네) -> 해당 객채 d의 vptr을 통해 Dog->Cry() 실행

 

 

가상(virtua) 함수가 있는 클래스는 

객체당 가상함수 테이블을 가르키는 vptr용 포인터 4 or 8 바이트가 추가됩니다.

 

클래스당 1개의 가상함수 table이 있고, 가상함수 갯수 * 4 또는 8 * 상속깊이가 되버리죠

 

다운캐스팅

부모 클래스의 포인터를 자식 클래스의 포인터로 바꾸는 것

#include <iostream>
using namespace std;

class Animal {
public:
	void cry() { cout << "Crrr" << endl; }
};

class Dog : public Animal {
public:
	void cry() { cout << "Mung" << endl; }
};

void foo(Animal* p) {
	Dog* pDog = dynamic_cast<Dog*>(p);
	
    if (pDog != 0) pDog->cry();
	else p->cry();
	
}

int main() 
{
	Animal a;
	Dog d;

	foo(&a);
	foo(&d);
}

 

여기서는 dynamic_cast<>() 를 통해 다운캐스팅 해준 모습입니다.

 

이때 RTTI 방식을 사용 했다고 볼 수 있죠.

 

똑같이

Crrr

Mung 이 출력됩니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.