c++ - Абстрактный класс и его наследники


0

Знаю, что если есть абстрактный клас(например: Account) и наследники абстрактного класа(PrivelegeAccount, SavingAccount), то можно через указатель на родительский класс(Account*) использовать наших наследников.

Так вот задача: У нас должен быть динамический массив аккаунтов разных типов. Как такое сделать и можно ли через vector такое сотворить?

С уважением.

Источник
  •  63
  •  1
  • 7 янв 2018 2018-01-07 20:21:35
@AR Hovsepyan, ну я имел ввиду указатели — 9 янв 20182018-01-09 10:14:39.000000
@Evgenii Izhboldin, если даже очень захотите, всеравно не сможете реализовать вектор с типом Account, так как речь идет о том, что это абстрактный класс — 8 янв 20182018-01-08 06:14:39.000000
храните указатели(простые или умные) — 8 янв 20182018-01-08 05:07:21.000000
не, так не работает, пробовал — 8 янв 20182018-01-08 03:31:22.000000
Так и объявляйте вектор с типом Account*, и можно будет в него помещать объекты наследники, но использовать вы сможете лишь те методы что доступны в родителе (здесь не рассматриваю явное приведение к классу предка). Подобные примеры есть в любом учебнике по ООП, можете посмотреть. — 7 янв 20182018-01-07 21:56:23.000000

1 ответ

2

Вам следует хранить элементы в векторе по указателю. Лучше использовать smart pointer. Что то вроде:

struct Account
{ 
    virtual ~Account() = default; // Пожалуй все-таки не стоит забывать про виртуальный деструктор
    virtual std::string GetMessage() = 0;
};

struct PrivelegeAccount final: public Account
{
    virtual std::string GetMessage() override final { return "PrivelegeAccount"; }
};

typedef std::unique_ptr<Account> AccountPtr;

int main()
{
    std::vector<AccountPtr> vector;
    vector.emplace_back(std::make_unique<PrivelegeAccount>());

    for (const auto& account : vector)
        std::cout << account->GetMessage() << std::endl;

    return 0;
}
  • 8 янв 2018 2018-01-08 08:54:28
@Dim shraed_ptr - указатель с разделяемым владением. unique_ptr же единолично владеет объектом. И, если вам не требуется наличия указателя на один объект в нескольких местах вашей программы, логичнее использовать unque_ptr, который, как минимум, "легче" чем shared_ptr — 8 янв 20182018-01-08 08:39:40.000000
@Dim Не обязательно unique_ptr. Все зависит от задачи. В данном примере вид указателя значения не имеет. — 8 янв 20182018-01-08 08:32:48.000000
А почему обязательно unique_ptr или почему лучше shared_ptr ? — 8 янв 20182018-01-08 08:30:23.000000
Контейнеры можно и нужно часто заполнять unique_ptr. Абстрактным класс может быть "логически". А вот виртуальный деструктор не помешал бы. — 8 янв 20182018-01-08 06:34:04.000000
Во первых тут базовая структура не является абстрактным классом( суть не в этом), во вторых контейнеры лучше заполнять обьектами shared_ptr — 8 янв 20182018-01-08 06:11:30.000000