【发布时间】:2016-10-06 13:02:50
【问题描述】:
B. Stroustrup 最初将 C++ 设计为没有 dynamic_cast,但后来人们不得不在语言中添加一些东西。无论我在哪里遇到dynamic_cast 的用法,它都反对对象的多态使用。所以有时候你会更喜欢知道对象类型而不是尝试重新设计你的代码来利用多态性?那些是什么情况?能举个例子吗?
附:请考虑dynamic_cast 在代码中添加了大量 RTTI 信息,这是添加到语言的部分反射,因为类层次结构信息存储在编译代码中。这违背了 C++ 哲学——你为你使用的东西付费。 (我知道你可以关闭 RTTI,但默认情况下它是打开的,你可能在整个代码中都不需要它!)
编辑:根据@Griwes 的 cmets,RTTI 的转向是可能的,但它是未定义的行为。因此,上述与 C++ 哲学相关的结论变得更加有力。
【问题讨论】:
-
dynamic_cast所需的“大量 RTTI 信息”已添加,因为dynamic_cast需要它。你为你使用的东西付费。最后一段没有意义。 -
我认为这是一个“业务需求” :) 您需要有办法进行快速而肮脏的 hack。昨天的要求是持有大量
Animal对象并将它们全部设为sleep()。现在客户说让我们先拥有Cat对象meow()。现在,什么更好?让Cat总是在meow()之前sleep()或者只是拥有if (dynamic_cast<Cat*>(animals[i]) != NULL)...? :) 你去。 -
“而不是试图重新设计你的代码来利用多态性” - 所以你是说在
if (auto ptr = dynamic_cast<foo *>(bar))足够的所有情况下,我应该为我的类型添加一个新的虚函数?伟大的。 ...等一下。没有不烂的 C++ 开放式多方法。哎呀。 -
@R.MartinhoFernandes 我不确定——RTTI 不是语言的一部分,因此通常启用(包括开销),即使没有在特定程序中使用?我认为这就是 OP 的意思。
-
@PeterA.Schneider 语言中的一切“都是语言的一部分,因此通常启用”。这有点重复。然而,这并不意味着一切都必须生成代码。
标签: c++