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

C++ polymorphism use child constructor

本文关键字:构造函数 多态性 C++      更新时间:2023-10-16

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

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类等相同。

我的问题是:当对象的引用被给定时,有没有一种方法可以构造一个子对象?

实现这一点的典型方法是在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/