多态类型是指声明或者继承了至少一个虚函数的类型
对于多态类型,一些信息必须延迟到运行时才可以确定,例如它的实际类型、所调用的虚函数的地址等 类型B
继承了声明有虚函数的类型A
,因此A
和B
都是多态类型。
struct A
{
virtual void foo() {} // 声明虚函数
};
struct B : public A
{
// 隐式继承了虚函数
};
...
B b{};
A& a_rb = b; // 将b绑定到A的左值引用a_rb上
typeid(decltype(a_rb)).name(); // decltype产生的是编译时即可确定的声明类型,因此为A
typeid(a_rb).name(); // 由于a_rb是多态类型的glvalue,typeid在运行时计算,因此为B
a_rb.foo(); // 这里调用的是B中的foo,其函数地址是运行时确定的
sizeof(b); // 这里的sizeof是编译器决定的,通常为8 (64位)