首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么引用多态类多态?

为什么引用多态类多态?
EN

Stack Overflow用户
提问于 2015-07-29 18:48:04
回答 1查看 86关注 0票数 3

众所周知,下面的代码片段会打印Derived或类似的内容。

代码语言:javascript
复制
#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是多态的。我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31708731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档