1、 繼承體系下的對象構造過程是怎樣的?
1> 調用所有的虛基類構造函數,從左到右,由最深到最淺(別忘記虛基類在對象模型中是以獨特的方式支持的,不涉及到在對象模型中的偏移量的問題)
2> 調用所有的上一層的基類構造函數,以基類的聲明順序爲順序(這是因爲一般基類的subobject都會被放在object的開始,並且按基類聲明的次序放置)
3> 如果class object有虛函數表指針,設定其初值,指向適當的虛函數表(開始進入派生類由編譯器安插的數據成員的構造咯)
4> 如果又一個member並沒有出現在成員初始化列表中,且它有一個默認構造函數,那麼該默認構造函數必須被調用
5> 記錄在成員初始化列表中的數據成員初始化操作會被放在constructor的函數本身,並以members聲明的順序爲順序。
6> 程序員自己的代碼(在此步以上的操作均爲編譯器安插的)
2、 繼承體系下的對象構造過程中如何壓制虛基類的構造函數的重複調用?
“virtual base class constructors的調用”有着明確的定義:只有一個完整的classobject被定義出來時,它纔會被調用;如果object只是某個完整的object的subject,它就不會被調用。
由繼承體系下的對象模型可知,當有Vertex3d的對象聲明時,首先調用Point部分的構造函數,由於是完整的class object被定義出來,所以調用成功。當調用Point3d或者Vertex的構造函數時,其內部對Point的構造函數的調用將會被抑制,因爲Point3d或Vertex只是完整object的subobject。
備註:複製構造、析構函數所需解決的問題大體相似,所以省略咯。。。