一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的。 设置虚函数须注意: 1:只有类的成员函数才能说明为虚函数; 2:静态成员函数不能是虚函数; 3:内联函数不能为虚函数; 4:构造函数不能是虚函数; 5:析构函数可以是虚函数,而且通常声明为虚函数。 类里面“定义”的成员函数是内联的,但是仍然可以成为虚函数,那么是不是可以说“内联函数不能成为虚函数”这句话有问题呢,是不是应该改成“显式定义的内联函数不能成为虚函数”。比如下面这个示例程序: #include <iostream> using namespace std; class Base{ public: virtual void f1(){cout < < "Father " < <endl;} }; class Drived1:public Base{ public: void f1(){cout < < "Son1 " < <endl;} }; class Drived2:public Base{ public: void f1(){cout < < "Son2 " < <endl;} }; void myPrint(Base* pBs){ pBs-> f1(); } int main() { Base father; Drived1 son1; Drived2 son2; myPrint(&father); myPrint(&son1); myPrint(&son2); system( "PAUSE "); return 0; } 输出: Father Son1 Son2 你可以发现,虽然f1在基类中定义的,按理说应该是内联函数,但是它仍然可以成为虚函 数。 类中定义的成员函数(函数体在类中)能成为虚函数,大部分编译器能够将虽然声明为inline但实际上不能inline的函数自动改为不inline的。至于编译器会不会将inline and virtual的函数照模照样的实现,与编译器及优化方式有关。 要想成为虚函数,必须能够被取到地址.内联函数不能被取到地址所以不能成为虚函数. 你写inline virtual void f(),不能保证函数f()一定是内联的,只能保证f()是虚函数(从而保证此函数一定不是内联函数) 对于问题: 到底内联函数能不能成为虚函数? 答案是不能.问题是你不能够确定一个函数到底是不是inline的.inline关键字只是对编译器的一个建议:"如果有可能,请把此函数搞成inline的" |
|