c ++:动态选择要创建的子类

时间:2010-01-24 01:13:56

标签: c++ class dynamic derived

我是c ++的新手,我有一个问题。

假设我们有一个基类Base和两个派生类Derived1和Derived2。 F.E. Derived1有一个带整数的构造函数,Derived2有一个带布尔值的构造函数。

是否可以在运行时(或在编译时)确定要创建哪两个子类并将其分配给Base类。

这样的事情: Base b = ???(value),其中value的类型为integer或boolean。

提前致谢!

3 个答案:

答案 0 :(得分:8)

写一个名为createMyBlaBla的函数的两个重载。一个接受int,另一个接受bool。每个人都返回所需的派生类类型。 e.g:

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

人们将此称为工厂模式。

答案 1 :(得分:6)

您可能需要Factory Design Pattern

答案 2 :(得分:0)

我真的不认为这可能是你想要的方式, C ++中的多态性不能像这样工作。

如果我理解得很好,你想要一个声明为Base的变量决定, 取决于参数类型,它是否将是Derived1或 Derived2,全部不使用Factory模式。

无法做到这一点的原因是Base class并不真正意识到它的存在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;