2
考虑如下代码:如果基类有/没有附加的虚拟方法,为什么非虚拟方法的行为(当从派生类中调用时)会改变?
#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的(*此)。名称()返回“B类”,而不是“类A”从类B.调用时
的成员函数print1()不是虚拟的,但在从类B调用时仍然返回“类B”,这是因为在类A中存在另一个虚拟的成员函数,在这种情况下,它是print2()。
由于成员函数print1()没有虚拟说明符,不管结果总是“class A”,不管它叫什么名字?为什么不是这种情况?