C++相当于java的实例
2022-08-31 05:54:43
实现java C++等效的最佳方法是什么?instanceof
尝试使用:
if(NewType* v = dynamic_cast<NewType*>(old)) {
// old was safely casted to NewType
v->doSomething();
}
这要求编译器启用 rtti 支持。
编辑:我对这个答案有一些很好的评论!
每次你需要使用dynamic_cast(或实例)时,你最好问问自己这是否是必要的。这通常是设计不佳的标志。
典型的解决方法是将要检查的类的特殊行为放入基类上的虚拟函数中,或者可能引入类似访问者的内容,您可以在其中为子类引入特定行为而无需更改接口(当然,添加访问者接受接口除外)。
正如所指出的,dynamic_cast不是免费来的。处理大多数(但不是所有情况)的简单且一致的执行黑客基本上是添加一个枚举,表示您的类可以具有的所有可能类型,并检查您是否获得了正确的类型。
if(old->getType() == BOX) {
Box* box = static_cast<Box*>(old);
// Do something box specific
}
这不是好的oo设计,但它可以是一种解决方法,其成本或多或少只是一个虚拟函数调用。无论是否启用 RTTI,它都可以工作。
请注意,此方法不支持多级继承,因此,如果不小心,则可能会以如下所示的代码结尾:
// Here we have a SpecialBox class that inherits Box, since it has its own type
// we must check for both BOX or SPECIAL_BOX
if(old->getType() == BOX || old->getType() == SPECIAL_BOX) {
Box* box = static_cast<Box*>(old);
// Do something box specific
}
根据你想做什么,你可以这样做:
template<typename Base, typename T>
inline bool instanceof(const T*) {
return std::is_base_of<Base, T>::value;
}
用:
if (instanceof<BaseClass>(ptr)) { ... }
但是,这纯粹对编译器已知的类型进行操作。
编辑:
此代码应适用于多态指针:
template<typename Base, typename T>
inline bool instanceof(const T *ptr) {
return dynamic_cast<const Base*>(ptr) != nullptr;
}