虚函数可以是内联函数吗?

Posted Nice vinke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚函数可以是内联函数吗?相关的知识,希望对你有一定的参考价值。

  虚函数是通过指针或引用调用函数时,通过虚函数表来确定调用的函数,在运行时确定。

  内联函数是在编译时,将调用函数处插入内联函数的代码,省去了函数调用时的开销。

  表面上看,虚函数不能为内联函数。我们在类中定义的函数都是内联函数,析构函数经常在类中定义,而析构函数又经常声明为虚函数,以前没有发现什么问题。

其实虚函数可以为内联函数,这与内联函数的定义没什么冲突。

  内联函数到底要不要在调用处展开取决于怎么调用内联函数。

  class A
  {

    A(){}

    ~A(){}

    virtual void foo()

    {

      cout << "A::foo" << endl;

    }

  }

  class B

  {

    virtual void foo()

    {

      cout << "B::foo" << endl;

    }

  }

  A *a = new B();

  int main()

  {

    a->foo();//不是内敛

    a->A::foo();//内联

  }

  无论显式还是隐式,inline都只是一个申请,最终由编译器决定内联还是不内联

    inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。

  另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。内联函数最重要的使用地方是用于类的存取函数。

以上是关于虚函数可以是内联函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

可以内联虚函数[重复]

gcc中内联的行为:虚函数的内联,尤其是我的析构函数

纯虚函数可能没有内联定义。为啥?

C++关键字 inline

缺少 vtable 通常意味着第一个非内联虚成员函数没有定义

如何解决“缺少vtable通常意味着第一个非内联虚成员函数没有定义。”