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