와이드용 애드센스


[C++] dynamic_cast C++

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "pch.h"
#include <iostream>
 
using namespace std;
 
class Parent {
public:
    virtual void Print() {}
};
class Child_1 : public Parent {
public:
    virtual void Print() {
        cout << "Child_1 is OK" << endl;
    }
};
 
class Child_2 : public Parent {
public:
    virtual void Print() {
        cout << "Child_2 is OK" << endl;
    }
};
 
int main()
{
    Parent *p_1 = new Child_1;
    Parent *p_2 = new Parent;
 
    Child_1 *pchild1 = dynamic_cast<Child_1*> (p_1);
    if (NULL == pchild1)
        cout << "Child_1 is NULL" << endl;
    else
        pchild1->Print();
 
    Child_2 *child2 = dynamic_cast<Child_2*>(p_2);
    if (NULL == child2)
        cout << "Child_2 is NULL" << endl;
    else
        child2->Print();
 
    Child_2 *pchild2 = dynamic_cast<Child_2*>(p_1);
    if (NULL == pchild2)
        cout << "Child_2 is NULL" << endl;
    else
        pchild2->Print();
 
    system("pause");
}
cs

dynamic_cast란?
부모 클래스의 포인터를 자식 클래스의 포인터로 안전하게 다운캐스팅(Safe Downcasting)하기 위한 방법.


dynamic_cast<>를 사용하기 위한 조건은 아래와 같다.
  • 상속 관계에서만 사용 가능
  • 하나 이상의 가상 함수(virtual function)을 가져야만 함
  • 컴파일러의 RTTI 설정이 있어야 함

캐스팅에 성공할 경우 캐스팅된 type을 리턴, 실패할 경우 NULL을 리턴함.
동적 변환이기 때문에 런타임에 데이터타입을 검사하게 되므로 성능 저하의 원인이 될 수 있다.


[참고]
MSDN - dynamic_cast Operator

실시간 타입 정보(RTTI:Run-Time Type Information)

 

덧글

댓글 입력 영역



애드센스