在C ++中,运行时类型信息(RTTI)是否意味着动态绑定?
答案 0 :(得分:5)
RTTI意味着编译器输出中包含附加信息,以便运行时代码可以了解有关通常在编译时丢弃的源代码类和类型的详细信息。
例如,机器代码不需要知道函数的名称以便调用函数 - 在机器代码中调用函数只需要知道目标函数的地址。
另一个例子:编译的机器代码不需要在运行时知道类类型的名称。但是,如果要构建自动序列化库,您可能希望知道每个类的文本名称,以便将其写入输出流。类名是RTTI。
如果通过动态绑定意味着能够在运行时通过字符串名称查找和调用方法或属性,这在编译时是未知的,那么是的,RTTI是可用于此目的的资源。
答案 1 :(得分:3)
RTTI表示在运行时确定引用(或指针)的动态类型:
class Base {};
class Dervied : public Base {};
Base* b ; // Static type of pointer is Base*;
b = new Base(); // Dynamic type (pointed to) is Base;
b = new Derived()' // Dynaic type pointed to is Derived.
RTTI正在计算b实际指向的类型,即b的动态类型。
RTTI价格昂贵且形式不好。
使用公共继承,Derived是-a Base,因此函数不应该关心动态类型;无论b指向Base还是Derived,它对b指向的任何事情都可以做任何事情。
如果你的函数需要知道动态类型,那么它表明你正在做一些外部的Base,它应该在基础中封装,作为你可以在Base上调用的方法。 / p>
如果你真的需要做一些外在的事情(你不能这样做,比如说,访问者,因为外部事物是多调度的),那么至少封装(突出的)RTTI的paet。让我们说一下,重要的是它是否是基础: 如果类型是什么,请执行以下操作: 当然,由于我添加了一个虚拟函数,我需要添加一个虚拟dtor,这意味着(Rule of Three)我还应该添加一个复制ctor和copy赋值运算符。这些没有显示。class Base {
virtual bool isBase() { return true; }
};
class Dervied : public Base {
virtual bool isBase() { return false; }
}
class Base {
virtual string typeName { return "Base"; }
};
class Dervied : public Base {
virtual string typeName { return "Derived"; }
}
答案 2 :(得分:2)
没有。动态绑定是一个相当宽松的术语,指的是在运行时决定基于某些上下文调用一组函数中的哪一个。它通常由对象的实际类型通过指向基类的指针决定,通常称为基类。
RTTI是一种在运行时发现对象的type_info对象的机制。虽然这两个概念有些相关,但它们彼此截然不同。