(转)内联(inline)函数与虚函数(virtual)的讨论
本文转自: http://topic.csdn.net/t/20051220/09/4469273.html
函数的inline属性是在编译时确定的, 然而,virtual的性质是在运行时确定的,这两个不能同时存在,只能有一个选择,文件中的inline关键字只是对编译器的建议,编译器是否采纳是编译器的事情。
1.内联函数是个静态行为,而虚函数是个动态行为,他们之间是有矛盾的。
2.我们之所以能看到一些象内联函数的虚函数,是因为某个函数是否是内联函数不是由我们说的算,而是由编译器决定的。我们只能向编译器建议,某个函数可以是内联函数(inline关键字),但是编译器有自己的判断法则。所以可能出现这样的情况:
2.1我们用inline声明的函数却没有inline
2.2我们没有用inline声明的函数却是inline
2.3对于inline函数,编译器仍然将它编译成一个有地址的函数
所以,情况比较复杂,从high-level来看的话很难判断函数是否是inline的,如果从low-level来看的话就比较清晰,非内联函数遵从函数调用机制,在汇编中用call来调用。内联函数则没有这些。
inline函数表示该函数是内联的,它建议编译程序在调用该函数的地方直接将函数的代码展开来插入caller的代码中.这个只是一种指示,至于会不会被内联,编译程序还会根据被声明为inline的函数的内部结构如:是否包含循环,复杂的函数调用等等来选择是否inline。
1.虚函数肯定不会被内联这一点毋庸置疑,因为虚函数只有到了Runtime才能被识别到底是哪一个被调用,而内联是编译期就会将代码展开并安插这个明显不是一回事。
2.inline有两种表现方式一种就是以inline在实现文件中(.cpp)指出这被称为显示内联,另外一种就如你所说类的声明和定义放入同一个文件这称为隐式内联,但是还是如前面所说inline只是一个提示符至于会不会内联还是由编译程序说了算。
#include <iostream>
using namespace std;
class A
{
public:
inline virtual void virFUn() { //类的成员函数作为回调函数 static方式实现
cout<< "我是A中虚函数,inline在这不起作用!"<<endl;
}
void f();
}; inline void A::f() {
cout<< "我是真正的内联函数,不能同时设置为虚函数!"<<endl;
} class B: public A
{
public:
virtual void virFUn() {
cout<< "我是B中虚函数!"<<endl;
}
};
int main()
{
A * pa;
B b;
pa = &b;
pa->virFUn();
A a;
a.f();
}
(转)内联(inline)函数与虚函数(virtual)的讨论的更多相关文章
- 函数内联 inline,__inline,__forceinline
▶ 感谢大佬的总结[http://www.cnblogs.com/xuemaxiongfeng/articles/2464850.html] ● 存储限定符 __inline 与关键字 inline ...
- C++ 内联(inline)函数
目录 内联函数的使用方法 内联函数的使用规则 使用inline的时机 inline函数与宏函数的差异 inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数 ...
- 虚函数&纯虚函数&抽象类&虚继承
C++ 虚函数&纯虚函数&抽象类&接口&虚基类 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过 ...
- 【转】C++ 虚函数&纯虚函数&抽象类&接口&虚基类
1. 动态多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型 ...
- C++ 虚函数&纯虚函数&抽象类&接口&虚基类(转)
http://www.cnblogs.com/fly1988happy/archive/2012/09/25/2701237.html 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多 ...
- C++ 子类继承父类纯虚函数、虚函数和普通函数的区别
C++三大特性:封装.继承.多态,今天给大家好好说说继承的奥妙 1.虚函数: C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现.子类可以重写父类的虚函数实现子类 ...
- [转]什么是C++虚函数、虚函数的作用和使用方法
我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例 ...
- 什么是C++虚函数、虚函数的作用和使用方法
我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例 ...
- C++纯虚函数、虚函数、实函数、抽象类,重载、重写、重定义
首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不 ...
随机推荐
- 【iCore3 双核心板】例程九:ADC实验——电源监控
实验指导书及代码包下载: http://pan.baidu.com/s/1o7wSEO6 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 前后端分离开发——模拟数据mock.js
mock.js 生成模拟数据,拦截ajax请求 <script type="text/javascript" src="http://libs.baidu.com/ ...
- 关于Currency类型和 TCurrencyFiled的悲剧
这2天程序出问题, 用户结算金额经常莫名其妙的多出了小数点后几位, 不用思考 肯定是因为浮点精度不准确的问题 查了一下, 程序中的数据类型使用的是Currency, 按照数据类型的描述, 这个金额类型 ...
- yii2知识点详解
yii2错误处理机制: 错误处理器将所有非致命PHP错误转换成可获取异常, 也就是说可以使用如下代码处理PHP错误 use Yii; use yii\base\ErrorException; try ...
- AspNet Mvc 路由解析中添加.html 等后缀 出现404错误的解决办法
使用Mvc 有时候我们希望,浏览地址以.html .htm 等后缀名进行结尾. 于是我们就在RouteConfig 中修改路由配置信息,修改后的代码如下 routes.IgnoreRoute(&quo ...
- Android高级第十一讲之不同系统间的区别
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Android系统不断的升级,从基础到中级再到高级,逐步升级是软件工程敏捷开发的一个重点,在每个版本 ...
- C++ 一个统计文件夹下所有代码文件行数的小工具
// CodeLines.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Commdlg.h> #inclu ...
- 将一个query后面的参数转为数组
function detailUri($params) { $returnParams = array(); if (isset($params)) { $arParams = explode(&qu ...
- Java学习——Number类、Character类
Number类 在使用数字时,我们通常会使用内置数据类型,如 int a = 9; float b = 3.14 然而在实际开发中,我们经常遇到需要使用对象而不是使用内置数据类型的对象.为了解决这一问 ...
- Linux:安装OpenSSH-Server E:Package openssh-server has no installation candidate
$sduo apt-get install openssh-server Reading package lists… Done Building dependency tree Reading st ...