给出了以下代码:
#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()是虚拟的,所以当从类B调用时,.name().name()返回“类B”而不是“A类”。
成员函数print1()不是虚拟的,但是在从类B调用时仍然返回“类B”,因为类A中还有另一个成员函数是虚拟的,在本例中是print2()。
由于成员函数print1()没有虚拟说明符,所以结果不应该总是“A类”,而不管在哪里调用它?为何不是这样呢?
发布于 2016-11-29 18:21:08
当typeid应用于多态类类型(这是“至少有一个虚拟函数的类”的花哨名称)时,总是返回动态类型,使用的上下文并不重要。
换句话说,在这种情况下,typeid本身的行为就像一个虚拟函数。
https://stackoverflow.com/questions/40872510
复制相似问题