typeid用于多态指针?

use*_*355 13 c++ polymorphism typeid

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

(这是来自typeid的多态类型的后续问题)

jog*_*pan 9

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

首先,这里描述了当typeid应用于类类型的左值时会发生什么(即,当它执行您期望的情况时):

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

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

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

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

所以,是的,指针具有您描述的多态特征,但不是在结果时typeid.

(实际上,所有的多态特性(特别是多态成员函数调用)只有在涉及使用*或使用某种显式解除引用时才会显现出来->.所以你应该说指针本身不是polymorphic;只有你取消引用它们时得到的对象.)


AnT*_*AnT 5

您的问题是术语使用不正确。C ++语言在指针本身和这些指针指向的对象之间进行了非常清晰的区分。指针类型不是多态的。指针本身没有多态性。真正可以是多态的是指针指向的类型。当指针指向多态类型时,我们经常[非正式地]称其为多态指针(就像“指向多态类型的指针”的简写)。但是当涉及到时typeid,他们会非常正式地看到事物。对于typeid指针类型,永远不会是多态的。

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

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

  • +1 以谨慎使用术语。这让我意识到自己对这些词的使用草率。 (2认同)