0

抽象クラスをコーディングしましたA

value()「何でも」を返す仮想関数を作成する可能性はありますか?派生クラスを作成すると、Bここで関数を実装し、そこvalue()から何かを返しますか?

これが私の意図の例と説明です:

class A {
    public virtual void value() = 0;
};

template < class T >
class B : public A {
    private T content;
    public T value() { return content; };
};

ご覧のとおり、特にその場合に使用できるユニバーサル コンテナーを作成しようとしています。

std::vector< A > container;
B< int > bint;
B< std::string > bstring;
B< zoo::monkey > bmonkey;
container.push_back( bint);
container.push_back( bstring );
container.push_back( bmonkey );

これに対する解決策はありますか、それとも他のより良い解決策はありますか?

前もって感謝します。

4

2 に答える 2

1

オーバーライドの戻り値の型は、基本クラス関数の型と共変でなければなりません。

共変型は、コンパイラによって別の型に「置換」できます。これが意味することは、基本クラスは何かを返す必要があり、オーバーライドはそれに変換可能な何かを返す必要があるということです。

あなたの場合、voidベースから戻ってきて、void共変でvoidあるだけです-したがって、書かれているvoidように、派生クラスメソッドから a のみを返すことができます。

「何でも」コンテナに格納するために使用できる汎用クラスを作成しようとしているので、Boost.VariantまたはBoost.Anyを調べることをお勧めします。バリアント型のクラスをゼロから書くのは意外と難しく、すでに発明された車輪です。

于 2013-06-13T14:45:22.887 に答える
1

あなたはまだboost::anyまたはboost::variantを見ることができます

于 2013-06-13T14:32:57.570 に答える