专业编程基础技术教程

网站首页 > 基础教程 正文

C++的虚函数可以是内联函数吗 c++中虚函数

ccvgpt 2024-11-12 09:54:40 基础教程 479 ℃


先说结论:C++的虚函数可以是内联函数。但 inline virtual 唯一可以内联的时候是编译器知道所调用的对象是哪个类。

C++的虚函数可以是内联函数吗 c++中虚函数

1、虚函数和内联函数

虚函数:类成员函数前面添加virtual关键字,则该函数被称为虚函数。

虚函数是为了实现多态机制,需要在基类中定义虚函数。多态,就是用基类型别的指针指向其派生类的实例,然后通过基类的指针调用实际派生类的成员函数。这种技术可以让基类的指针有“多种形态”。

内联函数:在函数前面添加inline关键字,则该函数被称为内联函数。

内联函数在调用时并不通过函数调用的机制,而是通过将函数体直接插入调用处来实现的,这样可以大大减少由函数调用带来的开销,从而提高程序的运行效率。

需要注意的是:inline声明对编译器来说只是一种建议,编译器可以选择忽略这个建议。比如将一个1000多行的函数指定为inline,编译器就会忽略这个inline,将这个函数还原成普通函数。

因此,并不是说把一个函数定义为inline函数就一定会被编译器识别为内联函数,具体取决于编译器的实现和函数体的大小。

2、代码示例

比如下面这段代码:

  • 当使用类的对象来调用时,则虚函数可以当做是内联的,因为编译器在编译时就确切知道对象是哪个类的;
  • 但当使用基类指针或引用来调用虚函数时,它都不能是内联函数,因为调用发生在运行时,是动态绑定的。
#include <iostream>
using namespace std;

class Base {
public:
    inline virtual void Display() {
        cout << "Base: Display" << endl;
    }
};

class Derived : public Base {
public:
    inline virtual void Display() {
        cout << "Derived: Display" << endl;
    }
};

int main()
{
    // 这里的虚函数是通过具体对象调用的, 可以是内联的
    Base b;
    b.Display();
  
    // 这里的虚函数是通过基类指针调用的, 不能是内联的
    Base* bp = new Derived();
    bp->Display();
    delete bp;
    bp = nullptr;
  
    return 0;
}

运行结果:

最近发表
标签列表