Welcome

首页 / 软件开发 / C++ / C++如何处理内联虚函数

C++如何处理内联虚函数2010-11-24赵湘宁当一个函数是内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄 清楚内联和虚函数,让我们将它们分开来考虑。通常,一个内联函数是被展开的 。

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; }
};