一个函数能否即是虚函数又是内联函数?

来源:百度知道 编辑:UC知道 时间:2024/09/19 21:26:05
简单明了,速度! 大量抄袭资料者没分

一个函数不可以既是虚函数又是内联函数。
  严格的说法是:就算能建立内联虚函数,或者说虚函数被声明为内联函数,编译器遇到这种情况根本不会把这样的函数内联展开,而是当做普通函数来处理。编译器拒绝展开一个非虚内联函数,C++编译器常常首先会报错:“内联中断-函数太大”。如果内联函数调用自身,或者在某处传递其地址,编译器必须产生一个正常(外联)函数。对于内联虚函数,编译器将把它看做普通的虚函数。
  应用中最好不要使用内联虚函数,因为它们几乎不会被展开。实际中开发者常常将简短的虚函数放在类声明中,这样做的目的不是希望这个函数被展开为内联,而是因为这样做程序看起来更方便和可读性更强。

当然不能,虚函数意味在运行期确定函数的调用地址,内联函数如同宏的用法一样,相当于在编译期把调用内联的地方加上了函数实现的代码。前者是动态的,后者是静态的。
另外,即使编译器通过了编译,那么函数也不可能是内联的

通常,一个内联函数是被展开的。
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;
虚函数有多态性,意味着派生的类能实现相同的函数,但功能却不同。假设 GetVal 被声明为虚函数,并且有第二个 以不同方法实现的类 CFoo2:
class CFoo2 : public CFoo {
public:
// virtual in base class too!
virtual int CFoo2::GetVal() { return someOtherVal; }
};
如果 pFoo是一个 CFoo 或 CFo