为什么是一个引用多态类,多态

Why is a reference to a polymorphic class, polymorphic?

本文关键字:多态 引用 一个 为什么      更新时间:2023-10-16

众所周知,下面的代码片段显示的是Derived或类似的内容。

#include<iostream>
#include<typeinfo>
class Base { public: virtual ~Base(){} };
class Derived : public Base{};
int main()
{
     Derived d;    
     Base& b = d;
     std::cout << typeid(b).name() << 'n';
}

但是我想理解一个人是如何从标准(N4140)的§5.2.8/2段得出这个结论的。例如,b肯定是一个全局值,但Base&的类型与Base不同,所以我不能说b是多态的。我错过了什么?

From [expr]

如果表达式最初具有"引用T"(8.3.2,8.5.3)的类型,则该类型在之前被调整为T有进一步的分析吗?表达式指定由引用表示的对象或函数,而表达式为左值或右值,具体取决于表达式。

表达式b最初的类型是"引用Base",所以类型调整为Base。它是左值,也就是左值。

从[class.virtual]:

声明或继承虚函数的类称为多态类。

Base声明一个虚函数,所以它是一个多态类。

从[expr.typeid]:

typeid应用于类型为多态类类型(10.3)的glvalue表达式时,结果引用到一个std::type_info对象,表示最派生的对象(1.8)的类型(即动态的

基于以上,我们满足初始条件(表达式是一个glvalue,其类型是一个多态类类型),所以我们选择b所指向的最派生的对象。那就是d,它的类型是Derived

如果bBase而不是Base&,那么最派生的对象将是b本身。