在C ++中利用RTTI的实际用法

时间:2013-07-08 15:25:24

标签: c++ casting rtti typeid

完成了第1卷。在Bruce Eckel的C ++思考中,我已经开始阅读第二卷。专门讨论RTTI(运行时类型识别)的章节让我感到惊讶。我一直在阅读有关tyepiddynamic_cast

的文章

但是,我脑子里浮现出一个问题。他们通过提到的运营商利用RTTI的任何实际用途,即来自现实项目的一些例子吗?此外,遇到的限制是什么使其必要使用?

2 个答案:

答案 0 :(得分:1)

dynamic_cast对于添加可选功能

非常有用

void foo(ICoolStuff *cs)
{
  auto ecs = dynamic_cast<IEvenCoolerStuff*>(cs);
  if (ecs != 0)
  {
    ecs->DoEvenCoolerStuff();
  }

  cs->DoCoolStuff();
}

当你从头开始设计时,有可能将DoEvenCoolerStuff放入ICoolStuff并在不支持它的类中有空实现,但是当你需要更改现有代码时通常是不可行的

另一种用途是消息传递系统实现,其中可以使用dynamic_cast来区分您感兴趣的消息。更一般地说,面对the expression problem时可能需要它。

答案 1 :(得分:0)

我在旅行中看到的生产代码中最常见的RTTI示例是dynamic_cast,但它几乎总是用作设计不良的创可贴。

dynamic_cast主要用于多态类,然后从base到derived。但想一想。如果你有一个指向正确设计的多态类的基指针,为什么你需要一个指向派生类型的指针?理论上,您应该只需要调用virtual函数,并让实际的实例化处理实现细节。

现在有人说,尽管dynamic_cast是一个创可贴,但它仍然是两个邪恶中较小的一个。当“修复”损坏的设计意味着大型维护项目并且不会对性能产生影响时,这尤其正确。假设你有一个1 MLOC应用程序,修复学术上破坏的东西意味着必须触及100k行代码。如果没有性能原因进行更改,那么您只是为了修复它而修复它,但是您冒着创建数十个或数百个新错误的风险。这可能不值得。