[C++]Equivalent of instanceof (object type checking at run-time)- dynamic_cast
keywords: C++, instanceof, typeof
dynamic_cast
Java has keyword instanceof
and C# has function typeof
to check object type at run-time.
Does C++ have equivalent of instanceof?
Answer is dynamic_cast
:
if(NewType* v = dynamic_cast<NewType*>(old))
{
// old was safely casted to NewType
v->doSomething();
}
dynamic_cast
only works when compiler RTTI enabled.
dynamic_cast
is an operation with big cost.
std::is_base_of
std::is_base_of
template<typename Base, typename T>
inline bool instanceof(const T*) {
return std::is_base_of<Base, T>::value;
}
Usage:
if (instanceof<BaseClass>(ptr)) { ... }
Optimization for dynamic_cast
Priori - A Fast dynamic_cast<> Alternative
https://www.codeproject.com/Articles/609598/Priori-A-Fast-dynamic-cast-Alternative
https://github.com/DigitalInBlue/Priori
Fast dynamic cast in C++ for MSVC, outperforming the regular dynamic cast by up to 25 times
https://github.com/tobspr/FastDynamicCast
Cases
Eampple source:
class A
{
int a;
};
class B
{
char b;
};
int main(int argc, char* args[])
{
A ca;
A* Aptr = &ca;
B* Bptr = dynamic_cast<B*>(Aptr);
return 0;
}
Complication error:
error C2683: 'dynamic_cast': 'CA01' is not a polymorphic type
Caused by:
dynamic_cast
is used to type checking which a class is polymorphic( own a virtual function in self or the class it derived from own a virtual function) or there’s an inheritance between two classes.
Solution 1:
Add virtual function in class which cast from;
class A
{
int a;
virtual void fun01() {}
};
Solution 2:
Source class(input parameter of dynamic_cast
) inherit from target class.
class A
{
int a;
};
class B : public A
{
char b;
};
int main(int argc, char* args[])
{
A ca;
B cb;
A* Aptr = &ca;
B* Bptr = &cb;
A* ptr = dynamic_cast<A*>(Bptr);
}
B* ptr = dynamic_cast<B*>(Aptr);
was invalid if there’s no inheritance between A and B, there would be a compliation error.
Reference
C++ equivalent of instanceof
https://stackoverflow.com/questions/500493/c-equivalent-of-instanceof
Fast dynamic casting
http://www.stroustrup.com/fast_dynamic_casting.pdf
How slow is dynamic_cast?
http://www.nerdblog.com/2006/12/how-slow-is-dynamiccast.html
When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?
https://stackoverflow.com/a/332086/1645289
我与春风皆过客,你携秋水揽星河。----网络