私は、基本クラスとそのサブクラスを持っている:std :: make_unique <SubClass>を返すのはどうですか?
class Base {
public:
virtual void hi() {
cout << "hi" << endl;
}
};
class Derived : public Base {
public:
void hi() override {
cout << "derived hi" << endl;
}
};
は、派生オブジェクトの一意のポインタを作成するヘルパー関数を作成しようとしています。
1)この1作品:
std::unique_ptr<Base> GetDerived() {
return std::make_unique<Derived>();
}
2)しかし、この1つはコンパイルに失敗します。
std::unique_ptr<Base> GetDerived2() {
auto a = std::make_unique<Derived>();
return a;
}
3)のstd ::動きは働く:
std::unique_ptr<Base> GetDerived3() {
auto a = std::make_unique<Derived>();
return std::move(a);
}
4 )Baseインスタンスを作成すると、両方とも動作します:
std::unique_ptr<Base> GetDerived4() {
auto a = std::make_unique<Base>();
return a;
}
std::unique_ptr<Base> GetDerived5() {
auto a = std::make_unique<Base>();
return std::move(a);
}
なぜ(2)が失敗しますが他はうまくいくのですか?
'Base'に仮想デストラクタを与えると、カスタムデリータはもう必要ありません。 –
@RemyLebeau一方で、アプリケーションに応じて、アプリケーションに応じてvtableを持たないvtableを導入すると、プログラマはvtableを持たないより小さなオブジェクトサイズを好むかもしれません。 –
@MM: 'Base'と' Derived'にはすでにvtableがあります仮想 'hi()'メソッドに渡します。多態性(ポインタ/参照のみで動作する)を扱うときはいつでも、ベースクラスは常に仮想デストラクタを持っているべきで、派生したオブジェクトはベースポインタを使って適切に破棄することができます。 –