C++中哪些函數不能聲明爲virtual?

首先要明確,virtual是用於支持類多態的關鍵字,因此出如今類聲明以外的地方都是錯誤的。由此能夠判定下文的1 前端

  • 普通函數(即非類成員函數)不能是virtual的,不然不能經過編譯,virtual只能出如今類聲明中。
  • 構造函數(拷貝構造函數/賦值構造函數)不能是virtual的。編譯器會爲每個含有virtual函數生成一個函數表(位於rodata段),每一個類實例的最前端會包含一個指向該表的指針。若是構造函數也能夠virtual,那麼須要一個虛函數指針指向對應的虛函數表,但此時對象並未構造,虛函數指針是不存在的。這就出現了矛盾。若是在基類和子類構造函數中都調用了虛函數的話,將發以下事件:調用子類構造函數,以前先調用基類的構造函數,此時只會調用基類的該函數而非子類的重載函數,由於此時子類對象並未構造徹底,虛函數指針不起做用。
  • 靜態成員函數不能是virtual的,由於靜態成員函數屬於類而非單個具體對象,全部的對象共享一份代碼,沒有實現多態的必要。
  • inline成員函數能夠聲明爲virtual,可是在編譯時不會實際將代碼直接在調用處展開。
  • 友元函數也不能聲明爲virtual,由於友元關係是不能被繼承的,編譯會出錯。
相關文章
相關標籤/搜索