#include <iostream>
using namespace std;
class A
{
virtual void func()
{
cout << "zz\n";
}
virtual void prin();
};
inline void A::prin()
{
cout << "h";
}
int main()
{
return 0;
}
为什么inline
可以修饰virtual
函数呢?虚函数调用不是要在运行时才能确定吗?而inline
不是要在编译时就展开吗?
PHP中文网2017-04-17 14:55:32
作用非常有限,編譯器通常會無視inline修飾,當然也有例外:inline virtual
只有當物件類型在編譯時被確定時才會起作用,也就是呼叫這個inline virtual
的caller不能是引用或指針,可以是局部變量,static變量,全域變數。這時候編譯器可能會把這個virtual function優化成普通成員函數inline掉,但是否這麼做取決權在編譯器,不能保證。
天蓬老师2017-04-17 14:55:32
理論上這兩者應該是不共存的。但與virtual
不同,inline
只是編譯器的最佳化建議,編譯器不一定會採納inline
這個建议
,所以這兩者書寫上並存還是允許的,不過在實際編譯時,inline
就不會展開了。
另外我看到一些訊息,說virtual
函數也有可能在編譯時被確定,從而可以實現inline
。不過這都是Compiler Dependent,所以也不能絕對的去說。
高洛峰2017-04-17 14:55:32
我的建議是大多數情況下直接忽略inline
這個關鍵字,因為大多數C++編譯器都是智慧的處理函式內聯,幾百行的成員函式都可以直接內聯,而且如上所說inline
只是建議編譯器,並不起絕對的作用。