次のケースでは、スライスの問題が指摘されてい ます。
関数呼び出し中: オブジェクトのスライスとは?
私の質問は、代入演算子とコピー コンストラクターが仮想として宣言され、派生クラスが必要なデータを適切にコピーする場合、これらのケースの両方が解決されないでしょうか? もしそうなら、原則として値渡しはこれらの場合でも機能するはずですよね?
次のケースでは、スライスの問題が指摘されてい ます。
関数呼び出し中: オブジェクトのスライスとは?
私の質問は、代入演算子とコピー コンストラクターが仮想として宣言され、派生クラスが必要なデータを適切にコピーする場合、これらのケースの両方が解決されないでしょうか? もしそうなら、原則として値渡しはこれらの場合でも機能するはずですよね?
いいえ。引数は値で渡されるため、新しい基本オブジェクトが作成されます。
virtual
手段は「の動的型に依存する」ため、仮想コンストラクターなどはありませんthis
。コンストラクターが実行される前は、オブジェクトは存在しないため、派生した動的型を持つことはできません。
仮想代入演算子も、代入元のオブジェクトのタイプではなく、代入先のオブジェクトのタイプに依存するため、役に立ちません。
値によってコピーできるようにしたいが、ポリモーフィックな動作を維持したい場合は、別のオブジェクトへのポインターを保持し、コンストラクターと代入演算子でオブジェクトを複製するオブジェクトを作成できます ( Martinho Fernandes の Wheels のvalue_ptrなどを使用)図書館):
class Base {
public:
virtual Base* clone() const = 0;
virtual void do_stuff() = 0;
};
class CopyablePolymorphic {
public:
CopyablePolymorphic(Base* base) : ptr(base) {}
private:
value_ptr<Base> ptr;
};
class Derived1 : public Base {
public:
virtual Base* clone() const {
return new Derived1(*this);
}
virtual void do_stuff() {
//Derived1 stuff
}
};
class Derived2 : public Base {
public:
virtual Base* clone() const {
return new Derived2(*this);
}
virtual void do_stuff() {
//Derived2 stuff
}
};
//etc...
明らかに、コピー構築を次のように宣言することはできませvirtual
ん。オブジェクトはまだありません。ただし、コピーの作成を無効にすることはできます。
virtual
とはいえ、オブジェクトをスライスするとき、割り当てられたオブジェクトの静的型は依然として単なる基本クラスであるため、割り当てを行うことはまだ機能しません。割り当てた型に依存しない派生クラスになることはありません。