C++如何处理内联虚函数
作者:网络转载 发布时间:[ 2013/3/14 10:22:06 ] 推荐标签:
当一个函数是内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄清楚内联和虚函数,让我们将它们分开来考虑。通常,一个内联函数是被展开的。
class CFoo {
private:
int val;
public:
int GetVal() { return val; }
int SetVal(int v) { return val=v; }
};
这里,如果使用下列代码:
CFoo x;
x.SetVal(17);
int y = x.GetVal();
那么编译器产生的目标代码将与下面的代码段一样:
CFoo x;
x.val = 17;
int y = x.val;
你当然不能这么做,因为val是个私有变量。内联函数的优点是不用函数调用能隐藏数据,仅此而已。
虚函数有多态性,意味着派生的类能实现相同的函数,但功能却不同。假设 GetVal 被声明为虚函数,并且你有第二个以不同方法实现的类 CFoo2:
class CFoo2 : public CFoo {
public:
// virtual in base class too!
virtual int CFoo2::GetVal() { return someOtherVal; }
};
如果 pFoo是一个 CFoo 或 CFoo2 指针,那么,无论 pFoo 指向哪个类 CFoo 或 CFoo2,成员函数 pFoo->GetVal 都能调用成功。
如果一个函数既是虚拟函数,又是内联函数,会是什么情况呢?记住,有两种方式建立内联函数,
第一种是在函数定义中使用关键字 inline,如:
inline CFoo::GetVal() { return val; }
第二种是在类的声明中编写函数体,象前面的 CFoo2::GetVal 一样。所以如果将虚函数体包含在类的声明中,如:
class CFoo {
public:
virtual int GetVal() { return val; }
};
编译器便认为这个函数 GetVal 是内联的,同时也是虚拟的。那么,多态性和内联特性如何同时工作呢?
编译器遵循的第一个规则是无论发生什么事情,多态性必须起作用。如果有一个指向 CFoo 对象的指针,pFoo->GetVal 被保证去调用正确的函数。一般情况下,这是说函数 GetVal 将被实例化为非内联函数,并有vtable(虚表)入口指向它们。但这并不意味着这个函数不能被扩展!再看看下面的代码:
CFoo x;
x.SetVal(17)
int y = x.GetVal()
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11