为什么虚函数不应该是内联(inline)函数?

    其实,这不是一个十分常见的问题,提问者应该已经对C++有了一定的了解。当然,我并不是说虚函数不能内联的,比如有下面一个继承体系:

class base

{

    inline virtual void print();

};

void base::print()

{

    fprintf("base\n");

}

class derived1 : public base

{

    inline virtual void print();

};

void derived1::print()

{

    fprintf("derived1\n");

}

int main()

{

    base* p = new base;

    derived1 d1;

    (*p)->print(); //使用对象调用虚函数

    p = &d1;

    p->print(); //使用指针调用

}

    其实,在编译上面这段代码的时候,编译器将会遇到一个困惑,也就是p->print()这一句,我们知道,所谓内联函数,其实也就相当于一个宏,编译器将会用完整的函数代码来替换这个调用,但是,对于p->print()来说,应该用哪个函数来替换呢?显然,只能用基类base的print函数来替换,但,这却违背了我们的本意,我们是要在运行时,动态的调用派生类的函数(这也就是所谓的多态),从而编译器在遇到类似问题的时候,不得不忽略掉虚函数的内联属性,而暂时只保留一个接口(其实也就是虚函数指针),等到运行的时候,动态的加载相对应的函数。

    我并不否认虚函数也同样可以用inline来修饰,但你必须使用对象来调用,因为对象是没有所谓多态的,多态只面向行为或者方法,但是C++编译器,无法保证一个内联的虚函数只会被对象调用,所以一般来说,编译器将会忽略掉所有的虚函数的内联属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值