связанные списки с унаследованными классами в C ++? - PullRequest
2 голосов
/ 08 ноября 2011

Я создаю список классов для программы. Тем не менее, в базовом классе много детей, и у некоторых из них тоже есть дети. Должен ли я каким-либо образом изменить свой список для размещения унаследованных классов? Спасибо за любую помощь!

Отлично, спасибо за помощь! Это невероятно простой вопрос, но при создании класса для внуков это будет правильным форматированием?

Класс C: общедоступный B: общедоступный A {

или просто

Класс C: Общественный B {?

Ответы [ 4 ]

3 голосов
/ 08 ноября 2011

Возьмем следующую программу:

#include <iostream>
#include <list>

struct A
{
    virtual void hello()
       { std::cout << "Hello from A\n"; }
};

struct B : public A
{
    virtual void hello()
       { std::cout << "Hello from B\n"; }
};

int main()
{
    std::list<A>  l1;
    std::list<A*> l2;
    A a;
    B b;

    l1.push_back(a);
    l1.push_back(b);

    l2.push_back(&a);
    l2.push_back(&b);

    l1.front().hello();
    l1.back().hello();

    l2.front()->hello();
    l2.back()->hello();
}

Мы объявляем два списка, один с использованием экземпляров класса A, а другой с указателями на A.Вы можете поместить экземпляры B в первый список, поскольку B является A (из-за наследования).Однако, когда вы пытаетесь получить доступ к данным и методам из элементов в первом списке, вы не можете получить доступ к данным из B элементов, которые думают, что они принадлежат к классу A, даже если они не являются.

Дляхотя второй список работает из-за использования указателей и виртуальной перегрузки метода.

Надеюсь, это немного поможет в вашем вопросе.

1 голос
/ 08 ноября 2011

Вероятно, вы создаете не список классов, а экземпляры классов.Существует большая разница.Хотя «класс» - это просто определение членов и функций данных, экземпляр фактически заполняет это определение жизнью.

Кроме того, вы не можете поместить экземпляр унаследованного класса в список, в котором есть родительский класс.как тип хранения.Это работает, только если вы храните указатели или ссылки на экземпляры в списке и размещаете сами экземпляры в другом месте.

0 голосов
/ 09 ноября 2011

это только:

class C: public B {

и, конечно:

class B : public A {

C является подклассом B, который является подклассом A.

если вы хотите получить список сочетаний экземпляров A, B и C, вы должны объявить его:

list<A*> myClassList;
0 голосов
/ 08 ноября 2011

Проблема с контейнерами STL и наследованием заключается в том, что контейнеры STL хранят копий объектов, поэтому все расширенные свойства дочерних классов в процессе работы теряются.Решение состоит в том, чтобы оставить объекты в покое и не копировать их.

В контейнерах STL вы можете хранить [smart] указатели на базовый класс, поэтому будет скопирован только указатель.Или вы можете использовать навязчивые списки, такие как Boost :: Intrusive или queue.h

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