添加:虚函数(virtual)可以是内联函数(inline)吗?

This commit is contained in:
huihut 2018-04-02 20:40:11 +08:00
parent e385483120
commit 158d0a5704

View File

@ -103,7 +103,8 @@ int* const function7(); // 返回一个指向变量的常指针使用i
* 相当于把内联函数里面的内容写在调用内联函数处;
* 相当于不用执行进入函数的步骤,直接执行函数体;
* 相当于宏,却比宏多了类型检查,真正具有函数特性;
* 不能包含循环、递归、switch等复杂操作。
* 不能包含循环、递归、switch等复杂操作
* 类中除了虚函数的其他函数都会自动隐式地当成内联函数。
#### 使用
@ -140,6 +141,48 @@ inline int functionName(int first, int secend,...) {/****/};
2. inline函数无法随着函数库升级而升级。inline函数的改变需要重新编译不像non-inline可以直接链接。
3. 是否内联,程序员不可控。内联函数只是对编译器的建议,是否对函数内联,决定权在于编译器。
#### 虚函数virtual可以是内联函数inline
[Are "inline virtual" member functions ever actually "inlined"?](http://www.cs.technion.ac.il/users/yechiel/c++-faq/inline-virtuals.html)
* 虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联。
* 内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联。
* `inline virtual` 唯一可以内联的时候是:编译器知道所调用的对象是哪个类(如 Base::who()),这只有在编译器具有实际对象而不是对象的指针或引用时才会发生。即,与局部、全局、静态对象或组合内的完全包含的对象。
```cpp
#include <iostream>
using namespace std;
class Base
{
public:
inline virtual void who()
{
cout << "I am Base\n";
}
};
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();
return 0;
}
```
### assert()
断言是宏而非函数。assert宏的原型定义在`<assert.h>`C、`<cassert>`C++)中,其作用是如果它的条件返回错误,则终止程序执行。
@ -428,10 +471,10 @@ public:
**注意:**
* 普通函数不能是虚函数
* 静态函数不能是虚函数
* 内联函数不能是虚函数
* 构造函数不能是虚函数
* 普通函数(非类成员函数)不能是虚函数
* 静态函数static不能是虚函数
* 构造函数不能是虚函数
* 内联函数不能是表现多态性时的虚函数,解释见:[]()
```cpp
class Shape //形状类