は、以下のクラスを検討コピーするために使用される基本クラスのポインタからの属性を変更します:コピーされたオブジェクトは、それが
class Base {
public:
... // include virtual destructor and rest of methods
virtual void changeField(int val) = 0;
virtual Base * clone() const = 0;
};
class Derived: public Base {
int x;
public:
... // include its destructor and rest of its methods
void changeField(int val) { x = val; }
Derived * clone() const { return new Derived(*this); }
};
を私はDerived
オブジェクトを指す既存のBase *
ポインタbp
があるとします。次にbp->clone()
を呼び出してコピーを作成し、結果のオブジェクトのポインタをBase *
ポインタcopyPointer
に格納します。
copyPointer
のchangeField
に変更すると値は変更されますが、元のオブジェクトのフィールドも変更されています。どうしてこれなの?これを防ぐために私は何ができますか?最初から全く新しいオブジェクトを作成する必要がありますか?
編集:ここではは私が
int main() {
try {
Base * copyPointer = bp->clone();
copyPointer->changeField(5);
cout << copyPointer->print() << endl; //prints the field of Derived
delete copyPointer;
}
catch (exception& e) { // I also have an Exception class in my code
cout << e.what() << endl;
}
}
はあなたが記述挙動を示すコードを表示します。 – rubenvb
[mcve]を投稿してください。 – PaulMcKenzie
例で更新しました – CSishard