Форум программистов, компьютерный форум CyberForum.ru

Хранение экземпляров классов-наследников, и вызов их методов - C++

Восстановить пароль Регистрация
 
Countermeasure
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 2
07.01.2014, 22:47     Хранение экземпляров классов-наследников, и вызов их методов #1
Столкнулся с проблемой.
Есть класс-родитель и 2 класса-наследника.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base
{
public:
   void baseFunc();
};
 
class Derived1 : public Base
{
public:
   void derived1Func();
};
 
class Derived2 : public Base
{
public:
   void derived2Func();
};
И есть массив экземпляров классов Derived1 и Derived2
C++
1
vector <Base*> Array;
В него я записываю указатели этих экземпляров класса
C++
1
2
Array.push_back(new Derived1);
Array.push_back(new Derived2);
При таком подходе я не имею доступа к методам из классов Derived
C++
1
Array[0]-> //Здесь IDE дает использовать только метод baseFunc()
Как можно по-другому оформить хранение экземпляров классов Derived1 и Derived2, чтобы можно было использовать и их методы? Или целесообразнее просто создать вектора под каждый класс-наследник?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2014, 22:47     Хранение экземпляров классов-наследников, и вызов их методов
Посмотрите здесь:

C++ Вызов методов предка
C++ Как использовать наследников от стандартных классов? Например, CMyEdit?
Хранение прототипов методов класса и их непосредственной реализации в различных файлах C++
Вызов методов с одинаковыми именами для разных классов C++
Наследование. Неправильная работа одного из классов наследников C++
Вызов методов класса C++
C++ Хранение вектора экземпляров шаблонного класса неизвестного типа
Вызов методов классов по указателям C++
C++ Вызов методов базового и производного классов
C++ Вызов методов из классов
C++ Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов)
В зависимости от выбора пользователя, инициализировать один из классов-наследников и использовать только его C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
07.01.2014, 22:59     Хранение экземпляров классов-наследников, и вызов их методов #2
В данном случае от родителя вы не можете получить доступ к детям.

Вы можете получить доступ к родителю через детей:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <vector>
 
class Base
{
public:
    void baseFunc()
    {
        std::cout << "baseFunc" << std::endl;
    }
};
 
class Derived1 : public Base
{
public:
    void derived1Func()
    {
        std::cout << "derived1Func" << std::endl;
    }
};
 
class Derived2 : public Base
{
public:
    void derived2Func()
    {
        std::cout << "derived2Func" << std::endl;
    }
};
 
int main()
{
    Derived1* a = new Derived1;
 
    a->baseFunc();
 
    delete a;
    
    return 0;
}
palva
 Аватар для palva
2405 / 1627 / 203
Регистрация: 08.06.2007
Сообщений: 6,451
Записей в блоге: 4
07.01.2014, 23:11     Хранение экземпляров классов-наследников, и вызов их методов #3
Тут много вариантов, выбор из которых осуществляется по разным обстоятельствам. Иногда существенно, чтобы они были в одном массиве, скажем, для единого цикла по этому массиву. Иногда по некоторым данным объекта можно понять, какому классу объект принадлежит, например, есть явное поле с именем класса. Тогда вы можете перезагрузить оператор -> и выдавать диагностику, если что не так. Иногда вы гарантированно имеете объект правильного класса, тогда ссылку на объект можно преобразовать в ссылку нужного типа. Последнее очень рискованно и деструктивно, но хозяин - барин.

Хотя скорее всего вы плохо продумали структуру классов и алгоритм обработки.
Countermeasure
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 2
08.01.2014, 13:35  [ТС]     Хранение экземпляров классов-наследников, и вызов их методов #4
Спасибо за ответы. Действительно, было довольно глупо с моей стороны пытаться засунуть все дочерние классы в один массив, и ждать от них чуда.
Переделал под 2 массива под каждый класс-наследник.
Yandex
Объявления
08.01.2014, 13:35     Хранение экземпляров классов-наследников, и вызов их методов
Ответ Создать тему
Опции темы

Текущее время: 10:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru