C++ 没有RTTI,但仍然是虚拟方法

C++ 没有RTTI,但仍然是虚拟方法,c++,polymorphism,rtti,C++,Polymorphism,Rtti,可以在禁用运行时类型信息的情况下编译C++代码,这将禁用dynamic\u cast。但是,虚拟(多态)方法仍然需要根据目标的运行时类型进行调度。这是否意味着类型信息仍然存在,并且动态强制转换应该能够始终工作?禁用RTTI会杀死动态强制转换和类型ID,但对虚拟功能没有影响。虚拟函数通过具有任何虚拟函数的类的“vtable”进行调度;如果您想避免使用vtable,就不能使用虚拟函数 P>在C++中,大量的C++代码可以在没有 DyrimeCase>代码的情况下工作,几乎所有的代码都可以在没有 T

可以在禁用运行时类型信息的情况下编译C++代码,这将禁用
dynamic\u cast
。但是,虚拟(多态)方法仍然需要根据目标的运行时类型进行调度。这是否意味着类型信息仍然存在,并且
动态强制转换
应该能够始终工作?

禁用RTTI会杀死
动态强制转换
类型ID
,但对虚拟功能没有影响。虚拟函数通过具有任何虚拟函数的类的“vtable”进行调度;如果您想避免使用vtable,就不能使用虚拟函数

<> P>在C++中,大量的C++代码可以在没有<代码> DyrimeCase>代码的情况下工作,几乎所有的代码都可以在没有<代码> Type ID >代码的情况下工作,但是相对较少的C++应用程序将在没有任何虚拟函数(或更重要的是,它们期望是虚拟的变成非虚拟的函数)的情况下生存。 虚拟表(vtable)只是指向所有虚拟函数的每类型查找表的每实例指针。你只需为你使用的东西付费(比亚恩喜欢这种哲学,最初反对RTTI)。另一方面,如果使用完整的RTTI,您的库和可执行文件最终会包含大量复杂的字符串和其他信息,用于描述每个类型的名称,以及可能的其他内容,如类型之间的层次关系


我见过生产系统,禁用RTTI会将可执行文件的大小缩小50%。这主要是由于大量的字符串名称,在一些C++程序中使用了大量模板。

我猜想VTHT仍然存在,但是因为它不包含任何类型信息(只有函数指针),虚拟函数仍然可以工作。……的可能副本……以便使动态转换工作。(在具有多重继承的复杂情况下)您需要的不仅仅是虚拟函数tables@SimonGibbons事实上,vtable就是类型信息:它对于类型是唯一的。因此vtable指针本身允许您检查对象是否属于特定类型(通过将其与该类型的vtable指针进行比较)。但是,对于动态向下转换,vtable中需要继承信息,在没有RTTI的情况下编译时可能会忽略这些信息。@DanielStevens您需要为每个向下转换提供一个函数。是的,基类需要知道它可以向下转换到的所有类的名称(正向声明就足够了)。根据您需要的下载次数,这可以转化为相当多的函数,因此这不是一种无需充分理由就可以避免RTTI的技术…好的,
dynamic\u cast
需要更多信息。但听起来
typeid
仍然可以工作,至少对于具有vtable的类型是这样。vtable pOcTybe从C++代码中手动访问?<代码> Type ID>代码>不能工作,因为它的主要目的之一是为每种类型提供名称,而这些名称(实际的空终止字符串)没有RTTI,就不会直接发送到对象文件中。而且,不可以在C++中以手动方式访问VTAL。可能有平台特定的方式,但即使是很少见的IO。哦,ScaseMe:。如果它是一个字符串(编辑:实际上
类类型\u info
),那么它就不起作用。