C ++多态性使用子构造函数

时间:2014-10-09 19:06:42

标签: c++ polymorphism

当父对象被赋予函数时,我想使用子类构造函数。

class foo {
public:
    virtual void doThing() { };
};

class bar : public foo {
public:
    void doThing() override;
};

class bar2 : public foo {
public:
    void doThing() override;
};

int main () {
    bar obj;
    bar2 obj2;
    someFunction(&obj);
    someFunction(&obj2);
}

void someFunction(foo *obj) {
   //child object construction
}

如果将bar类对象指针传递给someFunction(),那么它将在函数内创建新的bar对象。与bar2类相同,等等。

我的问题:在给出对象的引用时,有没有办法构造子对象?

1 个答案:

答案 0 :(得分:3)

这样做的典型方法是在foo中提供纯虚拟“克隆”方法,然后在成员中定义它。

特别优秀的设计师(优秀的设计师是一个懒惰的设计师)使用奇妙的递归模板模式(CRTP)来帮助解决这个问题。

class foo { public: virtual foo* clone() const=0; virtual ~foo(){}}
template <typename Derived>
class foo_helper : public foo
{
public:
   virtual foo* clone() const
   {
     return new Derived(static_cast<const Derived&>(*this));
   }
   virtual ~foo_helper(){}
}
class Bar : foo_helper<Bar>
{
public:
   virtual ~Bar(){}
}

另见: http://katyscode.wordpress.com/2013/08/22/c-polymorphic-cloning-and-the-crtp-curiously-recurring-template-pattern/