为什么是一个引用多态类,多态
Why is a reference to a polymorphic class, polymorphic?
众所周知,下面的代码片段显示的是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
。它是左值,也就是左值。
声明或继承虚函数的类称为多态类。
Base
声明一个虚函数,所以它是一个多态类。
当
typeid
应用于类型为多态类类型(10.3)的glvalue表达式时,结果引用到一个std::type_info
对象,表示最派生的对象(1.8)的类型(即动态的
基于以上,我们满足初始条件(表达式是一个glvalue,其类型是一个多态类类型),所以我们选择b
所指向的最派生的对象。那就是d
,它的类型是Derived
。
如果b
是Base
而不是Base&
,那么最派生的对象将是b
本身。
相关文章:
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 多态性和共享_ptr通过引用传递
- 多态变体,并将一种类型的引用绑定到另一种类型的引用
- C++多态性,关于宣布对派生类的基础类引用
- 收到未定义的引用错误 c++ 继承/多态性
- 具有引用成员变量的多态性
- 使用反向引用移动多态成员的构造函数
- 具有引用数据类型的函数多态性
- 带有引用的多态性没有按预期运行
- 多态性在没有指针/引用的C++中工作吗
- 使用具有多态性的引用时初始化无效
- 使用指针/引用影响本地成员的多态调用
- C++中的多态性不能与引用一起正常工作
- 对多态对象成员的无效引用
- 为什么不能将多态性与值一起使用,而是引用和指针
- 多态对象内部的C++引用
- 多态是否适用于在C中传递的c++对象引用?
- 成员变量多态性和参数引用
- 多态C++引用
- 为什么是一个引用多态类,多态