class Base {};
class Derived : public Base {};
void func(boost::optional<Base>&) {}
int main () {
boost::optional<Derived> x;
func(x);
}
func は、基本と派生の両方のオプションを受け入れますか?
class Base {};
class Derived : public Base {};
void func(boost::optional<Base>&) {}
int main () {
boost::optional<Derived> x;
func(x);
}
func は、基本と派生の両方のオプションを受け入れますか?
それが機能したとしても(私がチェックしていない可能性が高い)、スライスが発生します。一部のみBase
オプションに格納されます。
optional は、格納に必要なサイズのバッファーを内部的に保持しBase
ます。そして、 (あなたの場合のように)Base
と同じサイズであっても、それは.Derived
Base
編集:
上記の回答は、次のコードを含む元の質問に対して与えられました。
int main () {
boost::optional x(Derived());
func(x);
}
このようなコードは、次の 2 つの理由から正しくありません。
boost::optional
テンプレート引数が必要です私はこれらの問題を無視し、次のようなことが意図されていると想定しました。
int main () {
boost::optional<Base> x = Derived();
func(x);
}
そのコードはコンパイルされますが (少なくとも Visual Studio 2013 および Boost 1.60)、スライスが発生します。次のプログラムを実行するとわかります。
#include <boost/optional.hpp>
#include <iostream>
class Base
{
public:
virtual ~Base() { std::cout << "~Base" << std::endl; }
};
class Derived : public Base
{
public:
virtual ~Derived() { std::cout << "~Derived" << std::endl; }
};
int main()
{
boost::optional<Base> x = Derived();
}
出力を生成する
〜派生 〜ベース 〜ベース
2番目は、オブジェクトではなくオブジェクトを破壊する~Base
ことを示しています。(は、最初の と同様に一時オブジェクトからのものです。)optional
Base
Derived
~Derived
Derived()
~Base