当父对象被赋予函数时,我想使用子类构造函数。
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
类相同,等等。
我的问题:在给出对象的引用时,有没有办法构造子对象?
答案 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(){}
}