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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Полиморфизм, наследование и приведение экземпляров класса одного к другому - C++

01.04.2010, 22:09. Просмотров 1900. Ответов 3
Метки нет (Все метки)

Есть некий класс со своими переменными,его экземпляр занимает какое-то количество памяти.
Интерфейс выглядит примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* -------------------------------------------------------------------------- */
  class Subroutine {
     public:
 
        void setName(const string  *const s) {_name = *s;};
        void setVars(var_Arr_t *const vars) {variables = vars;};
        void setArrs(arr_Arr_t *const arrs) {arrays = arrs;};
        void setLabs(lab_Arr_t *const labs) {labels = labs;};
 
 
        std::string GetName()  const {return _name;};
        var_Arr_t   *getVars() const {return variables;};
        arr_Arr_t   *getArrs() const {return arrays;};
        lab_Arr_t   *getLabs() const {return labels;};
     private:
        string _name;
        stmt_Node_t *address;
        var_Arr_t *variables;
        arr_Arr_t *arrays;
        lab_Arr_t *labels;
        vector <Variable> params; // FIXME
  };
И у него есть класс потомок (так вроде называется?).И у этого класса-потомка есть ещё одна (для примера) переменная (и с ней экземпляр занимает другое количество памяти) :
C++
1
2
3
4
  class Function : public Subroutine {
     private:
        Value *returnable;
  };
Я хочу сделать одну таблицу,чтобы в ней были экземпляры этих двух классов в смешанном виде (то есть в первом поле будет какой-то флажок,для определения вида класса),вообще не знаю,хорошая ли это идея,но просто любопытно.. Как в этом случае будет распределяться память в контейнере? Можно ли безбоязненно приводить один тип к другому?
Тут у меня такое ощущение,что нужно делать контейнер для класса Function, и при необходимости приводить его к классу-родителю,но не наоборот. При этом между экземплярами будут "пустоты" в памяти. В обратном случае возможны "повреждения памяти",то есть расположение элементов будет "в нахлёст".
Правильно ли я понимаю? Или реализации компиляторов как-то заботятся о возможном добавлении класса потомка в контейнер?
Как правильно?

Добавлено через 10 минут
P.S. В принципе,можно хранить указатели на экземпляры класса,и тогда проблемы по идее быть не должно,но всё же ответ на вопрос хотелось бы услышать,чтобы понять суть.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2010, 22:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Полиморфизм, наследование и приведение экземпляров класса одного к другому (C++):

В чем заключается наследование одного класса другому? - C++
Вообщем есть пара заданий теория ,можек кто-нибудь помочь и ответить на них 1. В чем заключается наследование одного класса другому? В...

Наследование: как передать массив одного класса другому классу? - C++
Доброе время суток, нужна помощь. Не могу сотворить чудо. Сомневаюсь уже во всём. Как передать массив одного класса другому классу? Дабы...

Объяснить, что происходит в коде (приведение одного типа указателей к другому?) - C++
char* a = &quot;Hell&quot;; int* b =(int*) a; cout &lt;&lt; *b; Как я понимаю в этом кусочке кода происходит преобразование одного типа...

Приведение одного парметра-типа к другому разыменованному парметру-типу (указателю) в шаблонах - C++
Здравствуйте! изучаю C++, и есть такой вопрос, можно ли при инстанцировании, допустим, шаблонной функции привести один параметр-тип к...

Передача свойства одного экземпляра класса другому экземпляру класса - C++
#include &lt;tchar.h&gt; class A { public: A(); int aVar; }; class B : public A

Добавление экземпляров одного класса в другой класс - C++
Доброе утро! В программе создано 2 класса. 1-й предназначен для создания объекта под названием &quot;студент&quot;. Он имеет различные свойства (фио,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
02.04.2010, 16:49 #2
> Я хочу сделать одну таблицу,чтобы в ней были экземпляры этих двух классов в смешанном виде

Нельзя такого делать. Весь этот полиморфизм основан на том, что идёт работа с указателями (ссылками) на объекты, но не с самими объектами. При наличии на руках объекта смысл полиморфизма теряется, ибо имея объект, ты имеешь его тип. А имея укзатель ты имеешь только адрес в памяти, но не знаешь, что за объект там хранится. Но через указатель ты можешь обращаться к полям класса, которые есть и в базовом и в производном классе и компилятор гарантирует тебе симметричную работу. Тоже самое и с методами, в том числе и виртуальными
1
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
02.04.2010, 17:29 #3
Цитата Сообщение от Evg Посмотреть сообщение
Нельзя такого делать.
Точнее говоря, можно, но не нужно.
1
Evg
Эксперт CАвтор FAQ
17810 / 6016 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
02.04.2010, 17:35 #4
Цитата Сообщение от Nick Alte Посмотреть сообщение
Точнее говоря, можно, но не нужно.
Ага, так более правильно
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2010, 17:35
Привет! Вот еще темы с ответами:

Присваивание значений одного класса другому. - C++
Скажите, могу ли я присвоить значения одного объекта класса другому объекту того же класса? class card { //код код код }; int...

Как передать параметры конструктора одного класса другому? - C++
Скажите пожалуйста, как это должно работать? Как передать параметры конструктора одного класса другому? #include &lt;iostream&gt; using...

Приведение типа к другому классу - C++
Предположим есть класс class A { char a; void foo(); }; можно ли делать так class B: public A

Приведение переменной к другому типу - C++
float a = (float)x; // старый стиль float b = static_cast&lt;float&gt;(y); // современный стиль разве по старому не удобнее? почему...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.04.2010, 17:35
Ответ Создать тему
Опции темы

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