虚函数被声明为inline时,是否真正的被inline了?
虚函数可以被声明为inline,这是毫无疑问的,因为inline同register一样,只是对编译器的建议。
那么inline virtual函数是否会被内联展开呢?答案是可以!
有的人说不能,理由是virtual的意思是"等到运行时再决定调用哪个函数",inline的意思是"在编译期间将调用之处用被调函数来代替",如果编译器甚至还不知道哪个函数将被调用,当然就不能责怪它拒绝生成内联调用了。
其实上面的观点是不正确的,如果virtual可以在编译期决定调用什么函数,那么就可以被inline!
那么什么时候可以决定调用何种函数呢?
用一个类对象通过成员选择符.调用虚函数,如obj.vf()
这时虚函数vf()就可以被vc优化内联展开。这样调用等于告诉编译器你要调用的具体函数,在函数有inline修饰或是体内定义的情况下就会被内联展开。
当然还有其他情况可以被inline,总的意思是虚函数可以申明为inline,具体到编译器解释时候,如果编译器在编译的时候就可以确定该虚函数的决议,则编译器以inline方式静态决议该虚函数。如果编译器在编译的时候不能决定,则必须在运行时决议虚函数,此时虚函数不能以inline函数的方式调用。