我不明白为什么指针不是多态类型,因为我们可以使用指向派生类的基类指针来调用派生类的虚函数。这表明在运行时,系统可以确定指针是否是多态的,不是吗?
(这是typeid for polymorphic types的后续问题)
发布于 2013-06-09 23:39:47
您的问题存在术语使用不正确的问题。C++语言对指针本身和这些指针所指向的对象进行了非常明确的区分。指针类型不是多态的。指针本身没有任何多态。真正多态的是指针所指向的类型。当指针指向多态类型时,我们通常将其非正式地称为多态指针(就像“指向多态类型的指针”的缩写)。但当涉及到像typeid这样的东西时,他们会非常正式地看待事物。对于typeid,指针类型永远不是多态的。
并且编译器在运行时不确定指针是否是多态的。这种简单的区别在编译时总是一目了然。同样,如果将指针声明为指向多态类型的指针,则该指针称为多态类型。多态类型是一种包含虚函数的类类型(直接或间接)。显然,多态属性是类型的纯编译时属性。
在这种情况下,在运行时唯一可以确定的是所指向的对象在给定时刻具有哪种特定类型。
发布于 2013-06-09 23:08:18
事实上,在描述typeid的行为时,标准(C++11)使用了多态类类型这个术语,而不是多态类型
首先,这里描述了当typeid应用于类类型的左值时会发生什么(即,当它做你所期望的事情时):
(§5.2.8/2)当
typeid应用于类型为多态类类型(10.3)的glvalue表达式时,结果引用一个std::type_info对象,该对象表示GL值引用的派生最多的对象(1.8)的类型(即动态类型)。..。
但是当你将它应用于一个指针(即不是一个类类型的左值)时,下面的规则适用:
(§5.2.8/3)当
typeid应用于多态类类型的GL值以外的表达式时,结果引用表示表达式的静态类型的std::type_info对象。..。
它说你得到的是静态(而不是动态)类型,即你得到的是指针的声明类型,而不是它实际指向的对象类型。
所以,是的,正如你所描述的,指针具有多态特征,但当涉及到typeid的结果时就不是这样了。
(实际上,它们的所有多态特征(特别是多态成员函数调用)只有在涉及到某种显式的取消引用时才会显示出来,无论是使用*还是使用->。因此,您应该说指针本身并不是多态的;只有当您取消引用它们时获得的对象才是多态的。)
https://stackoverflow.com/questions/17010884
复制相似问题