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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
01.04.2010, 22:09     Полиморфизм, наследование и приведение экземпляров класса одного к другому #1
Есть некий класс со своими переменными,его экземпляр занимает какое-то количество памяти.
Интерфейс выглядит примерно так:
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. В принципе,можно хранить указатели на экземпляры класса,и тогда проблемы по идее быть не должно,но всё же ответ на вопрос хотелось бы услышать,чтобы понять суть.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2010, 22:09     Полиморфизм, наследование и приведение экземпляров класса одного к другому
Посмотрите здесь:

C++ Присваивание значений одного класса другому.
Наследование и полиморфизм. C++
C++ Добавление экземпляров одного класса в другой класс
C++ В чем заключается наследование одного класса другому?
C++ Приведение типа к другому классу
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,123
Записей в блоге: 26
02.04.2010, 16:49     Полиморфизм, наследование и приведение экземпляров класса одного к другому #2
> Я хочу сделать одну таблицу,чтобы в ней были экземпляры этих двух классов в смешанном виде

Нельзя такого делать. Весь этот полиморфизм основан на том, что идёт работа с указателями (ссылками) на объекты, но не с самими объектами. При наличии на руках объекта смысл полиморфизма теряется, ибо имея объект, ты имеешь его тип. А имея укзатель ты имеешь только адрес в памяти, но не знаешь, что за объект там хранится. Но через указатель ты можешь обращаться к полям класса, которые есть и в базовом и в производном классе и компилятор гарантирует тебе симметричную работу. Тоже самое и с методами, в том числе и виртуальными
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
02.04.2010, 17:29     Полиморфизм, наследование и приведение экземпляров класса одного к другому #3
Цитата Сообщение от Evg Посмотреть сообщение
Нельзя такого делать.
Точнее говоря, можно, но не нужно.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,123
Записей в блоге: 26
02.04.2010, 17:35     Полиморфизм, наследование и приведение экземпляров класса одного к другому #4
Цитата Сообщение от Nick Alte Посмотреть сообщение
Точнее говоря, можно, но не нужно.
Ага, так более правильно
Yandex
Объявления
02.04.2010, 17:35     Полиморфизм, наследование и приведение экземпляров класса одного к другому
Ответ Создать тему
Опции темы

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