Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Countermeasure
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 2
#1

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

07.01.2014, 22:47. Просмотров 917. Ответов 3
Метки нет (Все метки)

Столкнулся с проблемой.
Есть класс-родитель и 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, чтобы можно было использовать и их методы? Или целесообразнее просто создать вектора под каждый класс-наследник?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2014, 22:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Хранение экземпляров классов-наследников, и вызов их методов (C++):

Вызов методов из классов - C++
class B; class A { public: void foo() { B x; //Хотел вызвать метод нижнего класса. (Без наследования). x.foo(); } ...

Вызов методов классов по указателям - C++
Имеется управляющий класс, в котором определен указатель на функцию: void (Operation*) (); Как передавать по данному указателю...

Вызов методов базового и производного классов - C++
Народ, объясните тупому механику раннего связывания. Вывод программы, что ниже, 22. Хотя если вызывать непосредственно функцию f, будет...

Вызов методов с одинаковыми именами для разных классов - C++
В функцию func можно передать один из двух классов A или B. У них есть функции с одинаковыми именами, но разными входными переменными. Как...

Вызов метода у наследников абстрактного класса - C++
Добрый вечер. Разбираюсь с паттерном проектирования &quot;Декоратор&quot;. Имеется код: #include &lt;string&gt; #include &lt;iostream&gt; #include...

Одна функция для двух классов-наследников - C++
Допустим, есть класс Transport, у которого есть классы-наследники Auto и Velosiped. Надо написать функции, делающие примерно одно и то же...

3
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;
}
0
palva
2918 / 2052 / 328
Регистрация: 08.06.2007
Сообщений: 7,541
Записей в блоге: 4
07.01.2014, 23:11 #3
Тут много вариантов, выбор из которых осуществляется по разным обстоятельствам. Иногда существенно, чтобы они были в одном массиве, скажем, для единого цикла по этому массиву. Иногда по некоторым данным объекта можно понять, какому классу объект принадлежит, например, есть явное поле с именем класса. Тогда вы можете перезагрузить оператор -> и выдавать диагностику, если что не так. Иногда вы гарантированно имеете объект правильного класса, тогда ссылку на объект можно преобразовать в ссылку нужного типа. Последнее очень рискованно и деструктивно, но хозяин - барин.

Хотя скорее всего вы плохо продумали структуру классов и алгоритм обработки.
0
Countermeasure
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 2
08.01.2014, 13:35  [ТС] #4
Спасибо за ответы. Действительно, было довольно глупо с моей стороны пытаться засунуть все дочерние классы в один массив, и ждать от них чуда.
Переделал под 2 массива под каждый класс-наследник.
0
08.01.2014, 13:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2014, 13:35
Привет! Вот еще темы с ответами:

Наследование. Неправильная работа одного из классов наследников - C++
Привет, помогите пожалуйста. Есть базовый класс и 2 его наследника (audio и book), у которых по 2 метода (set() и get() ). Обьекты этих...

Как использовать наследников от стандартных классов? Например, CMyEdit? - C++
Я начал изучать MFC. Программа - простой диалог со строкой ввода. Диалог со строкой ввода нарисовал как ресурс. Мне нужно в clipboard...

В зависимости от выбора пользователя, инициализировать один из классов-наследников и использовать только его - C++
Всем здрасьте. У меня такая ситуация: Есть класс-родитель: Main Есть много классов-наследников: One, Two, Three, Four .... и т.д. ...

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов) - C++
Тема: Множественное наследование. Явная реализация методов базовых абстрактных классов. Как вынести методы из классов Panel и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.