2016-11-29 46 views
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”,不管它叫什么名字?为什么不是这种情况?

回答

3

typeid,当应用到多态类类型的东西(这是“具有至少一个虚函数的类花哨的名称),总是返回动态类型,使用的情况下也无所谓。

换句话说,在这种情况下,typeid本身的行为就像一个虚拟功能。

相关问题