0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
1

Почему RTTI работает только с иерархией классов, содержащие виртуальные функции?

29.03.2015, 12:54. Показов 2844. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему RTTI работает только с иерархией классов, содержащие виртуальные функции?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2015, 12:54
Ответы с готовыми решениями:

Наследование классов и виртуальные функции
Доброго времени суток. Передо мной стоит следующая задача: Разработать программу с использованием...

Виртуальные функции при создании иерархии классов
#include "stdafx.h" #include <iostream> using namespace std; class var{ int temperatura; ...

Реализовать иерархию классов, используя виртуальные функции
Здравствуйте! Хочется убедиться, что я правильно поняла задание. Буду благодарна за...

Виртуальные функции (создать массив указателей на объекты трех классов)
Задание: создать массив указателей на объекты трех классов. Метод Show почему-то не...

13
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
29.03.2015, 13:10 2
В других случаях тип и так известен.
0
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
29.03.2015, 13:33  [ТС] 3
Можете показать пример? (для сравнения)

Добавлено через 18 минут
У меня в книге написано:
Причина в том, что это - единственная иерархия классов, для которой бывает нужно присваивать адреса производных объектов указателям базового класса.
C++
1
2
3
4
5
6
7
8
class A {};
class B : public A {};
int main
{
    A* a = new A;
    B* b = new B;
    a = b;
//...
Не понятно мне это объяснение. Где я сглупил?
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.03.2015, 13:44 4
Цитата Сообщение от newbew Посмотреть сообщение
Почему RTTI работает только с иерархией классов, содержащие виртуальные функции?
не путайте RTTI (рантайм идентификация типов) и dynamic_cast,
который можно применять только к объектам полиморфных типов.

RTTI (рантайм идентификация типов) обеспечивает оператор typeid,
который работает, как с типами, так и с объектами.
причем, ему пофиг - полиморфные они, или нет.

http://rextester.com/BFJR83705

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
class A {};
class B : public A {};
int main()
{
    std::cout << "Hello, world!\n";
    
    A* a = new A;
    B* b = new B;
    
    std::cout 
        << "a - объект класса " << typeid(*a).name()<<'\n'
        << "b - объект класса " << typeid(*b).name()<<'\n';
}
4
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
29.03.2015, 16:22  [ТС] 5
Немного подумав, если у объекта нет виртуальных функций им невозможно безопасно пользоваться без знания типа?
Поэтому динамик каст работает только с полиморфными классами?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.03.2015, 16:47 6
Цитата Сообщение от newbew Посмотреть сообщение
Почему RTTI работает только с иерархией классов, содержащие виртуальные функции?
Видимо, потому что он работает через неявно объявленную виртуальную функцию pointer->my_type_is(). А следовательно, требует чтоб у объекта была таблица виртуальных функций.
0
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
29.03.2015, 16:58  [ТС] 7
Но моя описанная идея выше, правильная?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.03.2015, 17:04 8
Цитата Сообщение от newbew Посмотреть сообщение
Немного подумав, если у объекта нет виртуальных функций им невозможно безопасно пользоваться без знания типа?
Пользоваться как раз вполне можно. Какая вам разница что объект - не std::map, а его наследник, если ничего сверх функционала std::map вам не нужно? Вот с удалением возникнут проблемы (непонятно какой деструктор вызывать).
0
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
29.03.2015, 18:15  [ТС] 9
Тоесть, в этом тексте, из другой книги, говорится о небезопасности подразумевая деструкторы?
Ограничение диапазона действия операции динамик каст лишь полиморфными типами оправдано и с логической точки зрения. Действительно, если у объекта отсутствуют виртуальные функции, им невозможно безопасно пользоваться без знания его типа. Поэтому его нужно аккуратно применять лишь в контекстах, в которых он известен. А если тип объекта известен, то нет необходимости в операции динамик каст.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2015, 18:50 10
Лучший ответ Сообщение было отмечено newbew как решение

Решение

Цитата Сообщение от hoggy Посмотреть сообщение
причем, ему пофиг - полиморфные они, или нет.
Если typeid пофиг с точки зрения обеспечения компилябельности - ещё не значит, что пофиг с точки зрения результата.
В твоем примере будет просто выведен статический тип переменных (из-за того, что b объявлена как B*).
Измени 10 строку на
C++
1
A* b = new B;
и увидишь разницу в результате от наличия виртуальной функции в базовом классе:

http://rextester.com/EAX82498 без виртуальных функций;
http://rextester.com/ZMA72459 c виртуальной функцией.

Теперь вернемся к dynamic_cast, который между прочим тоже можно использовать для неполиморфных типов.
Главное учитывать направление преобразования по иерархии:

http://rextester.com/NDRAH43877 не работает (не компилируется);
http://rextester.com/KBFVKO83963 работает (компилируется).

И в добавочку:
Цитата Сообщение от hoggy Посмотреть сообщение
не путайте RTTI (рантайм идентификация типов) и dynamic_cast,
который можно применять только к объектам полиморфных типов.
dynamic_cast, как и typeid есть часть RTTI.
А учитывая, что без полиморфных типов должным образом не работает как typeid (выводит статические типы вместо рантайм), так и dynamic_cast (не компилируется вовсе в определенных случаях), можно утверждать, что именно RTTI (а не только подмножество в виде dynamic_cast) невозможно без полиморфизма.
2
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.03.2015, 18:51 11
Цитата Сообщение от newbew Посмотреть сообщение
Тоесть, в этом тексте, из другой книги, говорится о небезопасности подразумевая деструкторы?
Там вообще непонятно о чем говорится. Если у объекта есть виртуальные функции, это резко снижает необходимость в касте как таковом. Но уж если вам понадобилось сделать каст от предка к потомку, вам в любом случае нужно знать что объект действительно является нужным потомком. Динамик каст лишь автоматизирует проверку типа объекта.
0
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
29.03.2015, 19:11  [ТС] 12
Tulosba, можешь подкинуть хорошую статью что бы подробней об этом почитать?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2015, 19:19 13
Лучший ответ Сообщение было отмечено newbew как решение

Решение

Цитата Сообщение от newbew Посмотреть сообщение
подкинуть хорошую статью что бы подробней об этом почитать
Если бы по каждой теме была хорошая статья
Первые из гугла:
https://msdn.microsoft.com/en-... y8610.aspx
http://en.wikibooks.org/wiki/C... mming/RTTI
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.03.2015, 21:23 14
Цитата Сообщение от Tulosba Посмотреть сообщение
Если typeid пофиг с точки зрения обеспечения компилябельности - ещё не значит, что пофиг с точки зрения результата.
мне ненужно объяснять,
что для неполиморфных типов typeid отработает статически.

Цитата Сообщение от Tulosba Посмотреть сообщение
dynamic_cast, как и typeid есть часть RTTI.
причина, по которой он не компилируется для неполиморфа мне не понятны.
(ну кроме может быть идеологический)

читал где, что dynamic_cast под капотом использует typeid.

Цитата Сообщение от Tulosba Посмотреть сообщение
что именно RTTI (а не только подмножество в виде dynamic_cast) невозможно без полиморфизма.
RTTI - идентификация времени выполнения.

в статике невозможно идентифицировать то,
что может быть известно только в рантайме.

это как бэ понятно.

однако, если учесть, что никто в здравом уме не использует полиморфизм без виртуальных функций,
то для неполиморфов можно рассматривать как частный случай,
когда идентифицировать можно в статике.
0
29.03.2015, 21:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2015, 21:23
Помогаю со студенческими работами здесь

Реализовать иерархию классов (использовать наследование, полиморфизм, виртуальные функции)
Первый базовый класс – млекопитающие; поля – способ питания, вес, среда обитания. Во втором базовом...

задачка с иерархией классов (JAVA)
Создать иерархию классов Корпус-Плита-Плита с духовкой. В методе MAIN Создаются 2 плиты и...

Не могу разобраться с многоуровневой иерархией классов
namespace Map_5_Client { class MyObject { public String Name; public...

Консольное приложение с многоуровневой иерархией классов Животные
Добрый вечер! Помогите, нужна ваша помощь. Необходимо создать консольное приложение с...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru