您的位置:首页 > 其它

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

2012-03-01 19:15 309 查看
其实,这不是一个十分常见的问题,提问者应该已经对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++编译器,无法保证一个内联的虚函数只会被对象调用,所以一般来说,编译器将会忽略掉所有的虚函数的内联属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: