업캐스팅
- 자식 클래스 포인터에서 부모 클래스 포인터로 형변환을 할 수 있다
- 묵시적으로 일어난다
주의 부모 클래스와 자식 클래스의 배열 크기를 고려해야 한다 형변환은 포인터를 사용하기 때문
ex) class Animal {
public:
float xpos = 1;
float ypos = 2;
};
class FlyingAnimal : public Animal {
public:
float zpos = 3;
};
void printAnimals(Animal *a, int n) {
for (int i = 0; i < n; i++) {
cout << "(" << a[i].xpos << "," << a[i].ypos << ")" << endl;
}
}
FlyingAnimal *a = new FlyingAnimal[10];
printAnimals(a, 10); 업스케일링, 단 배열문제 발생
void printAnimals(Animal **a, int n) { 더블포인터로 배열 문제 해결을 위해 함수에도 더블포인터 선언
for (int i = 0; i < n; i++) {
cout << "(" << a[i]->xpos << "," << a[i]->ypos << ")" << endl;
}
}
Animal **a = new Animal*[10]; 더블포인터로 배열 문제 해결
for (int i = 0; i < 10; i++) {
a[i] = new FlyingAnimal;
}
다운캐스팅
- 부모 클래스 포인터에서 자식 클래스 포인터로 형변환을 할 수 있다
static_cast
- 기본적인 자료형 간의 형변환과 업캐스팅, 다운캐스팅을 컴파일 작업 때 완료해주는 방법
주의 다운캐스팅 할때 포인터가 다운캐스팅 할 클래스를 가리키고 있는지 확인해야 한다
ex) Base *b = new Drv1;
int *a = new int(5);
Drv1 *d1 = static_cast<Drv1*>(b); Drv1 *d1 = (Drv1*)b;로 가능하지만, b대신 a를 넣을 때 오류검출이 불가능하다
Drv1 *d1 = static_cast<Drv2*>(b); 실행은 되지만 멤버 변수의 자료형이 서로 다를 때 오류가 생긴다
d1->print();
dynamic_cast
- 다운 캐스팅을 런타임일 때 해줄 수 있는 방법
- 형변환에 성공했을 때만 포인터 타입을 반환하고 실패하면 NULL을 반환한다
- 자식 클래스가 2개 이상이고 이들을 배열에 두었을 때, 하나의 자식 클래스만 실행시키는 데 유용하다
- RTTI (Run Time Type Information/Identification)
- 가상함수가 하나라도 있는 클래스를 다형 클래스라고 부른다
ex) class Base { 다형 클래스
public:
virtual void f() { }
int x;
};
class Derived : public Base {
public:
void f() { }
int y;
};
sizeof(Base) 8 = 4(포인터) + 4(int x), 포인터는 클래스를 가리킨다
sizeof(Derived) 12 = 4(포인터) + 4(int x) + 4(int y)
------ 코드 확인 (링크 예정) -------
'Study > C C++' 카테고리의 다른 글
[두들낙서] 상속 (0) | 2021.03.04 |
---|---|
[두들낙서] 묵시적 형변환 (0) | 2021.03.04 |
[두들낙서] 객체 복사 (0) | 2021.03.04 |
[두들낙서] 동적 할당 (0) | 2021.03.04 |
[두들낙서] 클래스와 객체 (0) | 2021.03.04 |