這是合乎邏輯的。每個派生的對象都是基礎對象,因此上傳是自動的。但是每個基礎對象都不是派生的,因此你需要明確地施放它。
看到這個簡單的例子:
struct Fruit {};
struct Apple : Fruit {};
Apple apple;
Fruit fruit;
fruit = apple; //ok - automatic - since apple is fruit (see "object slicing")
apple = fruit; //error - not automatic - since fruit is necessarily apple!
請參閱錯誤和行號:
http://ideone.com/JnLc2
但是,如果你重載以下列方式operator=
,
struct Apple : Fruit
{
Apple & operator = (const Fruit &);
};
然後顯式轉換不需要。你可以寫
apple = fruit; //alright - assignment (not construction)
看到這個:http://ideone.com/IGbFI
現在,如果你補充一點:
struct Apple : Fruit
{
Apple(const Fruit &);
};
,那麼你可以寫
Apple apple = fruit ; //ok - construction (not assignment)
看到這個:http://ideone.com/muQc0
請注意,在第一個賦值「b = d」中,該對象將被*切片*以將其轉換爲「B」實例。這可能不是你通常想要或期望的。 – Thomas 2011-03-05 18:26:23