一道关于虚函数表的题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shanghairuoxiao/article/details/77341126

之前看过了陈皓大神关于虚函数表的博客,感觉对多态和虚函数表理解又清楚了一些,但是前不久喷到一道网易的笔试题,主要考察的也是对虚函数的理解,当时在某些地方又纠结了一下,自己写一段代码来验证,加深理解。网易的原题和下面的代码可能不一样,记不太清了。根据自己的理解写了一段代码。

#include <iostream>

using namespace std;

class base
{
public:
    void fun_no_virtual() { cout << "call fun_no_virtual in base" << endl; }
    virtual void fun_virtual() { cout << "call fun_virtual in base" << endl; }
};

class derive : public base
{
public:
    void fun_no_virtual() { cout << "call fun_no_virtual in derive" << endl; }
    virtual void fun_virtual() { cout << "call fun_virtual in derive" << endl; }
};

int main()
{
    base a;
    derive b;
    base *c;
    derive* d;

    c = &b;
    c->fun_no_virtual();
    c->fun_virtual();

    c = (base*)&b;
    c->fun_no_virtual();
    c->fun_virtual();

    d = (derive*)&a;
    d->fun_no_virtual();
    d->fun_virtual();

    return 0;
}

输出结果是:

call fun_no_virtual in base
call fun_virtual in derive
call fun_no_virtual in base
call fun_virtual in derive
call fun_no_virtual in derive
call fun_virtual in base

输出结果和我预料的一致,通过上面这段程序的运行结果充分说明了:
1 对于虚函数,通过对象去调用时,完全是查找虚函数表。无论被转化成派生类还是基类。
2 对于非虚函数,通过对象去调用,完全是根据对象类型去查找相应的函数指针,进行调用。

猜你喜欢

转载自blog.csdn.net/shanghairuoxiao/article/details/77341126
今日推荐