§1.3.7 (N4140) 中不是缺少"多态"一词吗?

Isn't the word `polymorphic` missing in §1.3.7 (N4140)?

本文关键字:多态 N4140      更新时间:2023-10-16

§1.3.7动态类型中缺少polymorphic(在括号中)这个词吗?

[示例:如果一个指针(8.3.1)p,其静态类型为"指向"B"指的是a (polymorphic) D类物体,从B(第10节)派生,表达式*p的动态类型为"d"。引用(8.3.2)的处理方式类似。-end example]

首先,即使我们想要在这种情况下要求多态性,将该要求强加给B而不是D类会更有意义(并且作为D也会成为多态的结果)。

其次,动态类型的一般概念不以任何方式依赖于多态性。

我不认为"动态类型"的定义需要这样的限定。如果您通读标准的其余部分,您将看到,当静态类型和动态类型不同时,这并不自动意味着表达式的行为与动态类型相似。这被指定为,只有当静态类型是多态时才会发生。例如,参见[expr.typeid]/2-3:

typeid应用于多态类类型(10.3)的glvalue表达式时,结果引用到一个std::type_info对象,表示最派生对象(1.8)的类型(即动态对象)类型)。如果将一元*运算符应用于一个指针,指针是空指针值(4.10),typeid表达式抛出异常(15.1)。匹配std::bad_typeid异常类型(18.7.3)的处理程序。

typeid应用于一个表达式而不是一个多态类类型的glvalue时,结果引用转换为一个std::type_info对象,表示表达式的静态类型。左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)转换不适用于表达式。如果类型为表达式是类类型,类必须是完全定义的。表达式是一个未求值的操作数(5)条款。

在第3段中,你可以看到它明确地说"静态类型"。这是因为静态类型和动态类型仍然可以不同,但只有静态类型重要,因为它不是多态的。

根据c++标准(10.3虚函数)

1虚函数支持动态绑定和面向对象编程。声明或继承虚函数的类是称为多态类

在你引用的引言中,没有要求类是多态的,也就是说它们有一个虚函数。因此,包含这个单词是不正确的。

引号给出了动态类型的一般定义,而不管类是否是多态的