mirror of
https://github.com/huihut/interview.git
synced 2024-03-22 13:10:48 +08:00
添加:虚函数(virtual)可以是内联函数(inline)吗?
This commit is contained in:
parent
e385483120
commit
158d0a5704
53
README.md
53
README.md
|
@ -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 //形状类
|
||||
|
|
Loading…
Reference in New Issue
Block a user