在语法上没有错误
首先要掌握一点,构造函数、析构函数、虚函数可以声明为内联函数,这在语法上是正确的。
如下面代码是正确的,因为inline同register一样,只是个建议,编译器并不一定真正的内联,在语法上是没有错误的
class A
{
public:
inline A() {}
inline ~A() {}
inline virtual void virtualFun() {}
};
int main()
{
return 0;
}
构造函数和析构函数声明为内联
将构造函数和析构函数声明为inline是没有什么意义的,需要思考的是构造函数、析构函数、虚函数被声明为inline有意义吗,或者说编译器是否对这些函数真正内联呢?
先来看构造函数和析构函数,参阅Effective C++得知,将构造函数和析构函数声明为inline是没有什么意义的,即编译器并不真正对声明为inline的构造和析构函数内联,因为编译器会在构造和析构函数中添加额外的操作(申请/释放内存,构造/析构对象等),致使构造函数/析构函数并不像看上去的那么精简。
虚函数声明为内联
函数的inline属性是在编译时确定的,然而,virtual的性质是在运行时确定的,文件中的inline关键字只是对编译器的建议,编译器是否采纳是编译器的事情。对于inline函数,编译器仍然将它编译成一个有地址的函数。
需要注意的几点:
1.虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联。
2.内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联。
3.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 *bptr = new Derived();
bptr->who();
delete bptr;
bptr = nullptr;
return 0;
}
参考:https://www.cnblogs.com/helloweworld/archive/2013/06/14/3136705.html
https://blog.csdn.net/cdlwhm1217096231/article/details/90744265