Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
joebiden
interview
提交
158d0a57
I
interview
项目概览
joebiden
/
interview
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
interview
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
158d0a57
编写于
4月 02, 2018
作者:
辉哈
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
添加:虚函数(virtual)可以是内联函数(inline)吗?
上级
e3854831
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
48 addition
and
5 deletion
+48
-5
README.md
README.md
+48
-5
未找到文件。
README.md
浏览文件 @
158d0a57
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录