2014-10-09 2 views
-1

Я хочу использовать конструктор дочернего класса, когда родительский объект был передан функции.C++ полиморфизм использует дочерний конструктор

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 и так далее.

Мой вопрос: существует ли способ создать дочерний объект, когда была указана ссылка на объект?

+3

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

+1

, или если вы не хотите полностью использовать CRTP, вы предоставляете чистый виртуальный метод «клонировать» в foo, а затем определяете его в членах. Но у вас есть другие проблемы с вашим кодом. doThing всегда должен быть виртуальным, ваш базовый класс должен, вероятно, быть чистым виртуальным, ect. – IdeaHat

+0

@OliverCharlesworth, клонированный рисунок много показывает в разработке программного обеспечения. Его полезно все время ... это действительно единственный способ сказать, сделать копию коллекции полиморфных объектов. – IdeaHat

ответ

3

Типичный способ, которым вы это делаете, - предоставить чистый виртуальный метод «клонировать» в foo, а затем определить его в членах.

Особенно хорошие дизайнеры (хороший дизайнер - ленивый дизайнер) используют шаблон Curiously Recursing Template Pattern (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/

Смежные вопросы