Base to derived conversion
suggest changeA pointer to base class can be converted to a pointer to derived class using static_cast
. static_cast
does not do any run-time checking and can lead to undefined behaviour when the pointer does not actually point to the desired type.
struct Base {}; struct Derived : Base {}; Derived d; Base* p1 = &d; Derived* p2 = p1; // error; cast required Derived* p3 = static_cast<Derived*>(p1); // OK; p2 now points to Derived object Base b; Base* p4 = &b; Derived* p5 = static_cast<Derived*>(p4); // undefined behaviour since p4 does not // point to a Derived object
Likewise, a reference to base class can be converted to a reference to derived class using static_cast
.
struct Base {}; struct Derived : Base {}; Derived d; Base& r1 = d; Derived& r2 = r1; // error; cast required Derived& r3 = static_cast<Derived&>(r1); // OK; r3 now refers to Derived object
If the source type is polymorphic, dynamic_cast
can be used to perform a base to derived conversion. It performs a run-time check and failure is recoverable instead of producing undefined behaviour. In the pointer case, a null pointer is returned upon failure. In the reference case, an exception is thrown upon failure of type std::bad_cast
(or a class derived from std::bad_cast
).
struct Base { virtual ~Base(); }; // Base is polymorphic struct Derived : Base {}; Base* b1 = new Derived; Derived* d1 = dynamic_cast<Derived*>(b1); // OK; d1 points to Derived object Base* b2 = new Base; Derived* d2 = dynamic_cast<Derived*>(b2); // d2 is a null pointer
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents