2011-05-11 122 views
6

假設我有兩個類A和B. B從A派生。A沒有數據成員,但B有兩個整數成員。C++:在基類的成員函數中複製對象數據

如果我在類A定義的方法,如下所示:

void CopyFrom(const A* other) 
{ 
    *this = *other; 
} 

,並調用它的子類,將整數數據成員被複制?

+0

我認爲他們不會被複制,但我想聽到正確的答案。 – 2011-05-11 17:07:39

回答

7

不可以。這被稱爲slicing problem

這是真實的,即使你在這兩個AB超載operator=*this = *other將只解析爲A::operator=(const A&)B::operator=(const A&)被調用。

+0

如何解決?在使用前投射它? – atoMerz 2011-05-11 17:07:27

+0

@AtoMerZ:這取決於你想要做什麼。如果你遇到了一個情況,你有一個指向B的'A *',而你想'CopyFrom'和另一個'B',那麼你可能做錯了! – 2011-05-11 17:10:14

+1

@AtoMerZ:[這個答案](http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c/274977#274977)的鏈接問題給出了最好的解決方案。 – Johnsyweb 2011-05-11 17:14:24

3

this沒有任何空間給子類的成員。所以Derived類的成員只會被切分。這個問題被稱爲Object Slicing

如何解決?
預防勝於治療!

不要將您的代碼引入到Object Slicing發生的情況。
如果您面臨的問題是Object Slicing,那麼您的建築/設計軟件程序設計不佳。除非因爲權宜而犧牲良好的面向對象設計。