提交 158d0a57 编写于 作者: 辉哈's avatar 辉哈

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

上级 e3854831
......@@ -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 //形状类
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册