众所周知,下面的代码片段会打印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当然是一个glvalue,但是类型Base&与Base不一样,所以我不能说b是多态的。我遗漏了什么?
发布于 2015-07-29 19:04:24
从费用
如果表达式最初的类型为“引用T”(8.3.2,8.5.3),则在进行任何进一步分析之前,该类型将调整为T。表达式指定引用所表示的对象或函数,表达式是lvalue或xvalue,具体取决于表达式。
表达式b最初具有“对Base的引用”类型,因此该类型被调整为Base。它是一个lvalue,它是一个glvalue。
来自class.virtual
声明或继承虚拟函数的类称为多态类。
Base声明了一个虚拟函数,因此它是一个多态类。
来自expr.typeid
当
typeid应用于其类型为多态类类型(10.3)的glvalue表达式时,结果引用一个std::type_info对象,该对象表示所引用的最派生对象 (1.8) (即动态类型)的类型。
基于上述,我们满足初始条件(表达式是一个glvalue,它的类型是多态类类型),因此我们选择了b所引用的最派生的对象。那就是d,它的类型是Derived。
如果b是Base而不是Base&,那么派生最多的对象将是b本身。
https://stackoverflow.com/questions/31708731
复制相似问题