-
[C/C++ 강좌] 82강. 상속에서의 형변환 (1) - 업캐스팅C++ 2022. 1. 20. 13:53
https://www.youtube.com/watch?v=QAo2sPtrRdM&list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&index=87
1. 업캐스팅
Base *s = new Derived();
Base클래스가 부모클래스이고 Derived가 Base클래스를 상속받은 자식클래스라고 하면 Derived클래스의 포인터가 Base클래스의 포인터로 묵시적 형변환이 일어났다고 생각할 수 있는데 밑(자식클래스)에서 위(부모클래스)로 올라갔다고 하여 업캐스팅이 일어났다고 말한다.
#include <iostream> using namespace std; 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; } } int main() { FlyingAnimal* a = new FlyingAnimal[10]; printAnimals(a, 10); delete[] a; }
자식클래스의 포인터가 printAnimals의 매개변수에 있는 부모클래스의 포인터로 들어가면 문제가 생긴다.
부모클래스의 x, y 저장 : 1 2 1 2 1 2 1 2 1 ...
자식클래스의 x, y, z 저장 : 1 2 3 1 2 3 1 2 3 ...
위와같이 저장되는데 자식클래스의 3번째 자리에는 3이 저장되어있고 부모클래스의 3번째 자리는 1이 저장되어있다.
이러한 경우에서 부모클래스의 포인터가 자식클래스의 포인터를 가리키면 부모클래스 포인터의 안에는 다음과 같이 저장이 된다.
1 2
3 1
2 3
1 2
3 1
2 3
.
.
.
실행결과
이런경우에는 다음과 같이 코드를 변경하면 된다.
#include <iostream> using namespace std; 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; } } int main() { Animal** a = new Animal * [10]; for (int i = 0; i < 10; i++) { a[i] = new FlyingAnimal; } printAnimals(a, 10); for (int i = 0; i < 10; i++) { // Animal*[10] 메모리 해제 delete a[i]; } delete[] a; // Animal** a 메모리 해제 }
이중포인터를 사용하고 포인터 배열을 가리킨 후에 포인터 배열들은 각각 업캐스팅을 통해 동적할당을 해주었다.
이러면 부모클래스의 크기만큼 메모리가 할당되고 자식클래스는 부모클래스로부터 동적할당되는 형태로 나타난다.
뭔가 복잡하다.
하지만 c++에서는 STL을 제공하여 이런 복잡함을 해결할 수 있으므로 바로 위의 예제가 이해가 안되더라도 크게 낙심 할 필요는 없다. 그래도 이해하고 싶으면 포인터와 동적할당 부분을 더 공부하면 된다.
'C++' 카테고리의 다른 글
[C/C++ 강좌] 84강. 상속에서의 형변환 (3) - RTTI와 dynamic_cast (0) 2022.01.20 [C/C++ 강좌] 83강. 상속에서의 형변환 (2) - 다운캐스팅 (0) 2022.01.20 [C/C++ 강좌] 81강. 생성/소멸자 실행 순서와 가상 소멸자 (0) 2022.01.19 [C/C++ 강좌] 80강. 순수 가상 함수와 추상 클래스 (0) 2022.01.19 [C/C++ 강좌] 79강. 상속이 필요한 이유 (2) (0) 2022.01.19