1. 程式人生 > 其它 >Effective C++ 條款9~10

Effective C++ 條款9~10

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