2

私はC++を初めて使用し、質問があります。

基本クラスBaseと2つの派生クラスDerived1とDerived2があるとしましょう。fe Derived1には整数を取るコンストラクターがあり、Derived2にはブール値を取るコンストラクターがあります。

実行時(またはコンパイル時)に、これら2つのサブクラスのどちらを作成してBaseクラスに割り当てるかを決定することは可能ですか?

次のようなものです。Baseb=???(value)、ここでvalueは整数型またはブール型です。

前もって感謝します!

4

3 に答える 3

8

と呼ばれる関数の2つのオーバーロードを記述しますcreateMyBlaBla。1つは受け入れint、もう1つは受け入れboolます。全員が目的の派生クラスタイプを返します。例えば:

Base* create(int n)
{
    return new Derived1(n);
}
Base* create(bool b)
{
    return new Derived2(b);
}
....
Base* b1 = create(10);    // Derived1
Base* b2 = create(false); // Derived2

人々はこれをファクトリパターンと呼びます。

于 2010-01-24T01:18:14.843 に答える
6

おそらくファクトリデザインパターンが必要です。

于 2010-01-24T01:18:20.863 に答える
0

私はこれがあなたが望むように可能だとは本当に思いません.C++のポリモーフィズムはこのようには機能しません.

私がよく理解していれば、Factory パターンを使用せずに、パラメーターの型に応じて、Derived1 または Derived2 のどちらになるかを Base が決定するように宣言された変数が必要です。

これが不可能な理由は、Base クラスがそのクラスの存在を実際に認識しておらずDerived 、スタック変数を宣言して派生クラスとして「動作」させることができないためです。ただし、回避策を提案することはできますが、これは、必要な実際のクラス階層の期待をすべて満たすわけではありません (本当にそのようにしたい場合は_:

class Facade{

public:
    Facade(int foo) : b(new Derived1(foo)){}

    Facade(bool foo) : b(new Derived2(foo)){}

    Base Value()
    {
        return *b;
    }

private:
    Base* b;

};

そして、次のようなことができます:

Facade foo(10);
Facade bar(true);

int x = (reinterpret_cast<Derived1*>(foo.Value())) -> val;
bool y = (reinterpret_cast<Derived2*>(bar.Value())) -> val;
于 2010-01-24T03:44:41.323 に答える