Создать объект класса, унаследованный от типа, предоставленного другим объектом - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть следующие классы

class CommonStyle
{};

class Style1 : public CommonStyle
{};

class Style2 : public CommonStyle
{};

class Style3 : public CommonStyle
{};

template<typename T> class ZStyle : public T
{
};

У меня есть объект, который может быть типом Style1, Style2, Style3.Как я могу создать объект ZStyle, унаследованный от Style1 или Style2 или Style3, зависит от предоставленного объекта?

//pseudo-code
int _tmain(int argc, _TCHAR* argv[])
{
 CommonStyle* obj1 = new Style1();
 CommonStyle* obj2 = new Style2();
 CommonStyle* obj3 = new Style3();

 ZStyle* zobj1 = create_object_inherited_from_style1(obj1);
 ZStyle* zobj2 = create_object_inherited_from_style2(obj2);
 ZStyle* zobj3 = create_object_inherited_from_style3(obj3);
}

Можно ли избежать dynamic_cast?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2011

Как насчет следующей CRTP-подобной модификации:

template<typename T> class ZStyle : public T
{
    ZStyle(T const &);
};

class CommonBase
{
    /* original CommonStyle in here */
    virtual CommonBase * z() const = 0;
}

template<typename T> class CommonStyle : public CommonBase
{
    virtual ZStyle<T> * z() const
    {
         return new ZStyle<T>(static_cast<T const&>(*this));
    }
};

class Style1 : public CommonStyle<Style1> { };
class Style2 : public CommonStyle<Style2> { };
class Style3 : public CommonStyle<Style3> { };

Использование:

CommonStyle* obj1 = new Style1();
ZStyle<Style1> * p = obj1.z();

В качестве альтернативы, вы можете сделать тип возврата z() равным CommonBase *, таквам не нужно беспокоиться о зависимости типа в последней строке.

0 голосов
/ 16 декабря 2011

Возможно, я отвечаю на другой вопрос, но это может быть решением вашей проблемы.

Идиома виртуального конструктора может быть полезна.

Вы создаетевиртуальный метод с именем clone () в базовом классе, который переопределяется в классах-потомках.Затем вы пишете CommonStyle * zobj1 = obj1.clone ();CommonStyle * zobj2 = obj2.clone ();CommonStyle * zobj3 = obj3.clone ();

Это приводит к трем объектам со статическим типом CommonStyle, но динамическим типом в зависимости от того, из какого объекта они были clone () '.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...