代码之家  ›  专栏  ›  技术社区  ›  George

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

  •  2
  • George  · 技术社区  · 14 年前

    我是C++新手,我有个问题。

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

    是否可以在运行时(或编译时)确定要创建和分配给基类的这两个子类中的哪一个子类?

    像这样: 基本B=????(value),其中value是integer或boolean类型。

    事先谢谢!

    3 回复  |  直到 14 年前
        1
  •  5
  •   Nikolai Fetissov    14 年前

    你可能想要 Factory Design Pattern .

        2
  •  8
  •   Khaled Alshaya    14 年前

    编写调用的函数的两个重载 createMyBlaBla . 一接受 int 和另一个接受 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
    

    人们称之为工厂模式。

        3
  •  0
  •   Anzurio    14 年前

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

    如果我理解得很好,你需要一个变量声明为base decides, 取决于参数类型,是否要派生1或 派生2,全部不使用工厂模式。

    这不可能的原因是, 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;