업캐스팅
부모 클래스를 통해 자식 클래스를 다루는 행위
#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 이 출력됩니다.