给出以下代码:
#include <iostream>
#include <typeinfo>
using namespace std;
class A
{
public:
void print1()
{
cout << typeid(*this).name() << endl;
}
virtual void print2()
{
cout << typeid(*this).name() << endl;
}
};
class B : public A {};
int main()
{
B b;
b.print1();
b.print2();
return 0;
}
我希望输出为:
class A
class B
但输出实际上是:
class B
class B
如果我从第二个函数中删除虚拟说明符,则输出符合预期:
class A
class A
据我所知,虚拟成员函数允许动态绑定,因此可以动态确定对象的类型。非虚拟成员函数不允许动态绑定,对吗?
上面代码中的成员函数print2()是虚拟的,这就是为什么typeid(* this).name()返回&#34; class B&#34;而不是&#34; A级&#34;当从B级调用时。
成员函数print1()不是虚拟的,但仍然返回&#34; B类&#34;从B类调用时只是因为A类中的另一个成员函数是虚拟的,在这种情况下是print2()。
由于成员函数print1()没有虚拟说明符,所以结果总是#A&#34; A&#34;,无论它在哪里被调用?为什么不是这样?
答案 0 :(得分:3)
typeid
,当应用于多态类类型(具有至少一个虚函数的&#34;类的奇特名称)时,始终返回动态类型。使用的背景并不重要。
换句话说,在这种情况下,typeid
本身就像一个虚函数。