如果基类具有/没有其他虚拟方法,为什么非虚方法的行为(当从派生类调用时)会发生变化?

时间:2016-11-29 17:52:08

标签: c++ c++14

给出以下代码:

#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;,无论它在哪里被调用?为什么不是这样?

1 个答案:

答案 0 :(得分:3)

typeid,当应用于多态类类型(具有至少一个虚函数的&#34;类的奇特名称)时,始终返回动态类型。使用的背景并不重要。

换句话说,在这种情况下,typeid本身就像一个虚函数。