Effective C++ 條款9~10
阿新 • • 發佈:2021-07-01
Effective C++ 條款09:絕不在構造和析構的過程中呼叫虛擬函式
構造一個派生類物件需要從基類開始構造,先構造了基類才有派生類。然而,我們 希望派生類在構造其基類部分的時候使用派生類所實現的方法。
根據多型的思想,我們可能在基類中寫一個虛擬函式。然後在基類的建構函式中呼叫這個虛擬函式。這樣似乎派生類在構造基類部分的時候,就可以通過這個虛擬函式呼叫自身實現的版本。但實際上這是行不通的。
因為派生類在構造基類的時候,它的類別就是基類。根本沒有派生成分。因此,就算是虛擬函式,也只能呼叫基類的那個版本。
解構函式也是同理,當解構函式呼叫的時候,物件的類別也退化成了基類。不存在派生類版本的實現,所以也只會呼叫基類的實現。
如果非要在基類的構造或者析構過程中使用到派生類的東西。可以將必要的資訊以引數的形式傳遞給基類的構造或者解構函式,在基類中實現這個功能。而不是以虛擬函式的形式進行呼叫。
Effective C++ 條款10:令operator=返回一個reference to *this
這樣做是為了能連等於,下面是個例子。
class Number{ public: Number& operator=(int num){ number = num; return *this; } private: int number; }; int main() { Number a, b, c; a = b = c = 1; a = (b = (c = 1)); }
像+=,*= ,/=這種帶有=性質的操作符,最好都返回一個*this