C++ 如果基类有/没有其他虚拟方法,为什么非虚拟方法(从派生类调用时)的行为会改变?
给出了以下代码:C++ 如果基类有/没有其他虚拟方法,为什么非虚拟方法(从派生类调用时)的行为会改变?,c++,c++14,C++,C++14,给出了以下代码: #include <iostream> #include <typeinfo> using namespace std; class A { public: void print1() { cout << typeid(*this).name() << endl; } virtual void print2() { cout << typei
#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 B
class B
如果从第二个函数中删除虚拟说明符,则输出与预期一样:
class A
class A
据我所知,虚拟成员函数允许动态绑定,因此可以动态确定对象的类型。非虚拟成员函数不允许动态绑定,对吗
上面代码中的成员函数print2()是虚拟的,因此当从类B调用时,typeid(*this).name()返回“class B”而不是“class A”
成员函数print1()不是virtual,但从类B调用时仍然返回“class B”,这只是因为类A中有另一个成员函数是virtual,在本例中是print2()
既然成员函数print1()没有虚拟说明符,那么无论从何处调用,结果不应该总是“class a”吗?为什么不是这样?
typeid
,当应用于多态类类型(这是“具有至少一个虚拟函数的类”的别致名称)时,总是返回动态类型。使用的上下文并不重要
换句话说,在这种情况下,typeid
本身的行为就像一个虚拟函数
class A
class A