什么是实现C++ instanceof的等价于java的首选方法?

推荐答案

try 使用:

if(NewType* v = dynamic_cast<NewType*>(old)) {
   // old was safely casted to NewType
   v->doSomething();
}

这要求编译器启用rtti支持.

编辑:

每次你需要使用动态投射(或instanceof)时,你最好问问自己这是否是必要的.这通常是设计拙劣的标志.

典型的解决方法是将要判断的类的特殊行为放入基类上的一个虚拟函数中,或者可能引入类似于visitor的东西,在其中可以在不更改接口的情况下为子类引入特定行为(当然,除了添加访问者接受接口).

正如前面所指出的,dynamic_cast并不是免费提供的.处理大多数(但不是所有)情况的一个简单且持续执行的hack基本上是添加一个枚举,表示类可以拥有的所有可能类型,并判断您是否得到了正确的类型.

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
}

Java相关问答推荐

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

使用标记时,场景大纲不在多个线程上运行

无法在WebSocket onMessage中捕获错误

如何获得执行人?

为什么JAVA&S清洁器使用链表而不是并发HashSet?

由于我在Main方法中关闭了 scanner ,但在该方法中创建了一个新的 scanner ,因此出现了错误

在Spring Boot应用程序中导致";MediaTypeNotSupportdException&qot;的映像上载

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

基于接口的投影、原生查询和枚举

匹配一组字符或另一组字符

搜索列表返回多个频道

如何在JavaFX中处理多个按钮

模拟JUnit未检测到返回字符串的方法的任何声纳覆盖

如何在Spring Security中设置一个任何人都可以打开的主页?

javax.crypto-密码对象-提供者服务是如何工作的?

Spring Boot Security-每个端点都被403禁止,Spring记录一个BasicErrorController#错误(HttpServlet请求)

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了

using case default on switch语句返回;预览特征切换中的模式匹配仅在源级别20及以上的情况下可用;

如何使用java区分以下结果