【面试题】【C++】请你说说虚函数可以是内联函数吗?

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

   虚函数可以是内敛函数,inline 可以修饰虚函数,但是当虚函数表现多态性的时候不能内联。
   解析:内联发生在函数的编译期间,编译器会自主选择内联,而虚函数的多态性发生在运行期间,编译器无法知道运行期间调用哪个代码,所以,当虚函数变现为多态性时不可以内联。
   inline virtual唯一可以内联的时候是:编译器知道所调用的对象是哪个类(如 Base::who()),这只有在编译器具有实际对象而不是对象的指针或引用时才会发生。

#include <iostream>  
using namespace std;
class Base
{
public:
   inline virtual void who()
   {
   	cout << "I am Base\n";
   }
   virtual ~Base() {}
};
class Derived : public Base
{
public:
   inline void who()  // 不写inline时隐式内联
   {
   	cout << "I am Derived\n";
   }
};

int main()
{
   // 此处的虚函数 who(),是通过类(Base)的具体对象(b)来调用的,
   // 编译期间就能确定了,所以它可以是内联的,但最终是否内联取决于编译器。 
   Base b;
   b.who();

   // 此处的虚函数是通过指针调用的,呈现多态性,需要在运行时期间才能确定,
   // 所以不能为内联。  
   Base *ptr = new Derived();
   ptr->who();

   // 因为Base有虚析构函数(virtual ~Base() {}),
   //所以 delete 时,会先调用派生类(Derived)析构函数,
   //再调用基类(Base)析构函数,防止内存泄漏。
   delete ptr;
   ptr = nullptr;

   system("pause");
   return 0;
} 

参考文献:

   https://blog.csdn.net/changyi9995/article/details/108245614

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值