typeid用于多态指针?

时间:2013-06-09 14:58:03

标签: c++ polymorphism typeid

我不明白为什么指针不是多态类型,因为我们可以使用指向派生类的基类指针来调用派生类的虚函数。这表明在运行时,系统可以确定指针是否是多态的,不是吗?

(这是来自typeid for polymorphic types)的后续问题

2 个答案:

答案 0 :(得分:9)

实际上,标准(C ++ 11)在描述typeid的行为时使用术语多态类型,而不是多态类型

首先,在这里,它描述了当typeid应用于类类型的左值时所发生的情况(即,当它达到你期望的情况时):

  

(§5.2.8/ 2)当typeid应用于类型为多态类类型(10.3)的glvalue表达式时,结果引用表示类型的std::type_info对象glvalue引用的大多数派生对象(1.8)(即动态类型)。 [...]

但是当你将它应用于指针(即不是类类型的左值)时,以下规则适用:

  

(§5.2.8/ 3)当typeid应用于多态类类型的glvalue以外的表达式时,结果引用表示表达式的静态类型的std::type_info对象。 [...]

它表示你得到静态(不是动态)类型,即你得到指针的声明类型,而不是它实际指向的对象类型。

所以,是的,指针在你描述时具有多态特征,但在涉及typeid的结果时却没有。

(事实上,当涉及使用*或使用->的某种显式解除引用时,它们的所有多态特征(尤其包括多态成员函数调用)仅表现出来所以你应该说指针本身不是多态的;只有当你取消引用它们时得到的对象才是。)

答案 1 :(得分:4)

您的问题会因错误使用术语而受到影响。 C ++语言对指针本身和这些指针所指向的对象进行了非常明确的区分。指针类型不是多态的。指针本身没有任何多态性。真正多态的是指针所指向的类型。当指针指向多态类型时,我们经常[非正式地]将其称为多态指针(就像“指向多态类型的指针”的简写一样)。但是当谈到像typeid这样的事情时,他们会非常正式地看待事物。对于typeid指针类型,从不是多态的。

并且编译器在运行时不确定指针是否是多态的。这种简单的区别总是在编译时立即知道。同样,如果指针被声明为指向多态类型的指针,则指针被称为 polymorphic 多态类型是一种包含虚函数(直接或间接)的类类型。显然,多态的属性是类型的纯编译时属性。

在这种情况下,唯一在运行时确定的情况是指定对象在给定时刻具有的特定类型。