반응형
동적 형변환 (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 */
반응형
'SW개발 > C++' 카테고리의 다른 글
따라하며 배우는 C++ 13장 (0) | 2021.03.21 |
---|---|
C++ 유도 클래스에서 출력 연산자 사용하기 (0) | 2021.03.21 |
C++ reference_wrapper (0) | 2021.03.21 |
C++ 객체 잘림 (Object Slicing) (0) | 2021.03.21 |
C++ 다이아몬드 상속 (Diamond Polymorphism) (0) | 2021.03.21 |