Хранить список классов и специализировать функцию путем подкласса в C ++? - PullRequest
0 голосов
/ 06 октября 2009

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

Единственный способ сделать это - использовать шаблоны, есть ли другие варианты?

Вот пример:

class A
{
    A() {}
    virtual void function()
    {
    }
}

class B : public A
{
    B() {}
    void function()
    {
    }
}

boost::shared_ptr<B> b = boost::shared_ptr<B>(new b);
std::list<boost::shared_ptr<A> > objects;
objects.push_back(b);

// pull t out of objects

t.function();

Редактировать: Это слишком упрощено, поэтому я исправил несколько вещей ...

Ответы [ 3 ]

8 голосов
/ 06 октября 2009

Это явление называется нарезкой . Ответ - хранить контейнер с указателями , такими как std::list<A*>. Просто не забудьте удалить все, когда вы закончите.

Если вы можете использовать библиотеки Boost, есть отличная библиотека Pointer Container , которая помогает с этой процедурой.

2 голосов
/ 06 октября 2009

function должно быть virtual, если вы хотите полиморфизм.

class A
{
    A() {}
    virtual void function()
    {
    }
}
0 голосов
/ 06 октября 2009

Как и предполагали другие, функция должна быть виртуальной. Чтобы сохранить его в списке, вы должны хранить их в виде указателей (как необработанных, так и с надстройками надстроек). Таким образом, когда вы вызываете функцию с помощью указателя, возникает полиморфизм и выполняется правильная функция.

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