본문 바로가기

Study/C C++

[두들낙서] 상속에서의 형변환

업캐스팅

 - 자식 클래스 포인터에서 부모 클래스 포인터로 형변환을 할 수 있다

 - 묵시적으로 일어난다

 주의 부모 클래스와 자식 클래스의 배열 크기를 고려해야 한다  형변환은 포인터를 사용하기 때문

 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