C++/Class
2021. 3. 21. 23:54
동적 형변환 (Dynamic Casting)
dynamic_cast
는 캐스팅이 실패하면nullptr
를 반환한다.
예제
간단한 예제
#include <iostream> class Base { public: int i_ = 0; virtual void print() { std::cout << "I'm Base\n"; } }; class Derived1 : public Base { public: int j_ = 1024; virtual void print() override { std::cout << "I'm Derived\n"; } }; int main() { using namespace std; Derived1 d1; Base* base = &d1; d1.j_ *= 2; auto* base_to_d1 = dynamic_cast<Derived1*>(base); cout << base_to_d1->j_ << endl; base_to_d1->j_ /= 8; cout << d1.j_ << endl; } /* stdout 2048 256 */
캐스팅 실패 예제
#include <iostream> class Base { public: int i_ = 0; virtual void print() { std::cout << "I'm Base\n"; } }; class Derived1 : public Base { public: int j_ = 1024; virtual void print() override { std::cout << "I'm Derived\n"; } }; class Derived2 : public Base { public: std::string name_ = "Dr. Two"; virtual void print() override { std::cout << "I'm Derived\n"; } }; int main() { using namespace std; Derived1 d1; Base* base = &d1; d1.j_ *= 2; auto* base_to_d1 = dynamic_cast<Derived2*>(base); if (base_to_d1 != nullptr) base_to_d1->print(); else cout << "Failed to cast\n"; } /* stdout Failed to cast */
정적 형변환 (Static Casting)
최대한 변환되도록 캐스팅한다.
위의 경우 가급적
Dynamic Casting
을 사용하는게 안전하다.#include <iostream> class Base { public: int i_ = 0; virtual void print() { std::cout << "I'm Base\n"; } }; class Derived1 : public Base { public: int j_ = 1024; virtual void print() override { std::cout << "I'm Derived\n"; } }; class Derived2 : public Base { public: std::string name_ = "Dr. Two"; virtual void print() override { std::cout << "I'm Derived\n"; } }; int main() { using namespace std; Derived1 d1; Base* base = &d1; d1.j_ *= 2; auto* base_to_d1 = static_cast<Derived2*>(base); if (base_to_d1 != nullptr) base_to_d1->print(); else cout << "Failed to cast\n"; } /* stdout I'm Derived */
'C++ > Class' 카테고리의 다른 글
C++ 유도 클래스에서 출력 연산자 사용하기 (0) | 2021.03.21 |
---|---|
C++ 객체 잘림 (Object Slicing) (0) | 2021.03.21 |
C++ 다이아몬드 상속 (Diamond Polymorphism) (0) | 2021.03.21 |
C++ 인터페이스 클래스 (Interface Class) (0) | 2021.03.21 |
C++ 추상 기본 클래스 (Abstract class) (0) | 2021.03.21 |