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