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

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

Войти
Регистрация
Восстановить пароль
 
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
#1

Как узнать тип производного класса в функции базового - C++

19.06.2014, 00:23. Просмотров 805. Ответов 3
Метки нет (Все метки)

Всем привет!
Есть иерархия классов:
C++
1
2
3
class1 -> class2->class3
              class2->class4
               class2->class5
Где стрелочки - наследование. Я создаю class3, class4, class5, в каждом из них есть экземпляры классов class2 и class1.
В классе class2 есть функция, которая должна отработать в зависимости от того, в каком из производных классов она была создана. Как мне узнать, на основе какого класса был создан экземпляр класса class2?
Буду благодарен за любые подсказки!!!
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2014, 00:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как узнать тип производного класса в функции базового (C++):

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? - C++
я хотел так, но программа просто падает void Student::add(Base** head) { cout << "I here" << endl; this->setName(); //все...

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Создание указателя типа базового класса на экземпляр производного класса - C++
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса - C++
Класс В является производным от класса А. Определить обработчик исключительной ситуации на преобразование указателя базового класса А на...

Вызов объектом базового класса функцию из производного класса! - C++
Как можно осуществить вызов или передачу значения в базовый класс для дальнейшего вычисления этого значения в производном классе. Вот...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
19.06.2014, 01:00 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Divergence Посмотреть сообщение
В классе class2 есть функция, которая должна отработать в зависимости от того, в каком из производных классов она была создана
Делаете эту функцию виртуальной в классе class2 и переопределяете как хотите уже в class{3-5}
Цитата Сообщение от Divergence Посмотреть сообщение
Как мне узнать, на основе какого класса был создан экземпляр класса class2?
Вы что-то путаете, class2 здесь создан всегда на основе class1 и никого больше.
Возможно, вопрос должен звучать так: как мне узнать, объект какого типа реально адресует указатель типа class2* (или ссылка)? .
Если реализация поддерживает RTTI, то
C++
1
std::cout << typeid(*class2Ptr).name() << std::endl;
распечатает имя искомого класса в некоторой зависящей от реализации манере.
Еще вариант через dynamic_cast<>() приводить объект типа class2* (или ссылку) ко всем производным по очереди и то приведение, которое не вернет вам nullptr (или не бросит исключение std::bad_cast), будет приведением к реально адресуемому типу.
1
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
20.06.2014, 03:11  [ТС] #3
Спасибо!
Теперь я понял, зачем вообще могут понадобиться эти касты!)
Раньше думал, что они только для упоротых психов))))
0
Deiron
26 / 26 / 1
Регистрация: 25.05.2009
Сообщений: 98
20.06.2014, 10:32 #4
ну, на самом деле, многие говорят (и, как я убедился на себе - правильно): "если объявив массив базового класса, при обращении к элементам его, вам необходимо знать, что за наследник там находится - у вас плохой дизайн".
Поэтому, пользуйтесь виртуальными функциями и делайте их так, чтобы не нужно было спрашивать "а какого ты типа?"
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2014, 10:32
Привет! Вот еще темы с ответами:

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса - C++
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...

Конструкторы базового и производного класса - C++
class first { public: first(int a):first(a){} void Setfirst(int a){first=a;} int Getfirst(){return first;} private: ...

Отрабатывает оператор базового, а не производного класса - C++
Здравствуйте! Собственно, вопрос в следующем. Я перегрузил оператор потокового вывода для базового и для производного класса. При выводе...

Вызов методов производного класса из базового - C++
Возможно ли, чтобы class A { void f1() { f2();//если вызвано из B, то вызывается B::f2(), а не A::f2() } void f2(){} }


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

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

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