C++虚函数(10) - 虚函数能否为inline?

守給你的承諾、 提交于 2019-12-03 22:05:08

虚函数用于实现运行时的多态,或者称为晚绑定或动态绑定。而内联函数用于提高效率。内联函数的原理是,在编译期间,对调用内联函数的地方的代码替换成函数代码。内联函数对于程序中需要频繁使用和调用的小函数非常有用。

默认地,类中定义的所有函数,除了虚函数之外,会隐式地或自动地当成内联函数(注意:内联只是对于编译器的一个请求,编译器可以自己决定是否进行内联).

无论何时,使用基类指针或引用来调用虚函数,它都不能为内联函数(因为调用发生在运行时)。但是,无论何时,使用类的对象(不是指针或引用)来调用时,可以当做是内联,因为编译器在编译时确切知道对象是哪个类的。

#include <iostream>
using namespace std;
class Base
{
public:
    virtual void who()
    {
        cout << "I am Base\n";
    }
};
class Derived: public Base
{
public:
    void who()
    {
        cout << "I am Derived\n";
    }
};
 
int main()
{
    // 此处的虚函数who(),是通过类的具体对象来调用的,编译期间就能确定了,所以它可以是内联的。
    Base b;
    b.who();
 
    // 此处的虚函数是通过指针调用的,需要在运行时期间才能确定,所以不能为内联。
    Base *ptr = new Derived();
    ptr->who();
 
    return 0;
}

语法上面来讲,在基类和子类的who函数前面加上inline关键字,是可以正常编译,运行的。

class Base
{
    inline virtual void who() {..........}
}
class Derived : public Base
{
    inline void who() {............}
}

参考:
http://www.parashift.com/c++-faq/inline-virtuals.html
Effective C++, by Scott Meyers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!