Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Небезопасность приведения. Не понимаю Прата

14.04.2017, 00:08. Показов 6808. Ответов 61
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
О коде, который описан в книге, слегка переправлен мной:
Приведение типов не безопасно: оно присваивает адрес объекта базового класса (Grand) указателю на производный класс (Magnificent). После этого программа будет ожидать, что объект базового класса содержит свойства производного класса, что в общем случае неверно. К примеру, объект Magnificent может содержать данные-члены, которых нет в классе Grand.
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
#include <iostream>
 
using std::cout;
 
class Grand {
public:
    virtual void foo(){}
    virtual ~Grand(){}
};
 
class Superb : public Grand {
public: 
    void foo_grand(){}
};
 
class Magnificent : public Superb {
public:
    void foo_magnificent(){}
};
 
int main() {
    Grand *pg = new Grand;
    Grand *pm = new Magnificent;
 
    Magnificent *p2 = (Magnificent*)pg; //небезопасно
    
    p2->foo_magnificent();
    p2->foo_grand();
 
    delete pg;
    delete pm;
}
Я вижу только один объект базового класса: pg. Программа будет ожидать, что pg будет содержать свойства производного класса? - Что-то я такого не наблюдаю.

Проясните, пожалуйста, о чём речь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.04.2017, 00:08
Ответы с готовыми решениями:

Небезопасность include, как быть?
почитал про небезопасность include, странно, как теперь быть то? вот мой индексный файл в котором много подключений, как можно сделать...

Прата С. 6.6
написал код, но после ввода первой структуры в цикле, выдает ошибку( //6.6.cpp #include &lt;iostream&gt; using namespace std; ...

С.Прата, задача 3.5
Гляньте, пожалуйста. Задача на преобразование целочисленных типов в с плавающей точкой. Вроде бы я решил: // запрос населения Земли и...

61
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.04.2017, 15:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от daslex Посмотреть сообщение
а суть: в книге враньё
Представьте, что через указатель наследника Вы вызвали невиртуальный метод наследника, - геттер поля, которого у родителя нет. А показывает указатель на родителя.
Кликните здесь для просмотра всего текста
СССР
Наркоман (на учёте в ментовке) достал кусок дури и ищет где бы его в квартире спрятать. Стоит посреди комнаты и рассуждает:
-Положу-ка я его в морозилку. Придёт участковый, пошарит кругом и спросит:-"А что, у тебя в холодильнике?". Найдёт гад!
-Тогда в телевизор можно засунуть, - продолжает он. И проговаривает снова сценарий очередного визита славного представителя районной милиции. Придёт участковый, пошарит кругом и спросит:-"А что, у тебя в холодильнике?". А я тут такой весь не приделах: -"Смотрите Афанасий Никонорыч!" и открываю холодильник. А там нет ничего.
С минуту бедолага стоит в комнате счастливо улыбаясь и уже было двинулся к телевизору, но вздрогнул, и остановился в мрачной задумчивости.
-А ведь после холодильника, он как пить дать спросит :-"А что у тебя в телевизоре!" И опять спалит меня с потрохами.
-А что если на антресоль спрятать? Так... Стоп. - Давай сначала!
Придёт участковый, пошарит кругом и спросит:-"А что, у тебя в холодильнике?" А там нету! Это хорошо. Тогда он спросит :-"А что у тебя в телевизоре!". А там тоже нет! И это хорошо! Тогда он спросит-таки :-"А что у тебя на антресоли!". Сквозь остекленение прорезается улыбка просветлённого счастья и он глядя на пакет в руке как на череп Йорика восклицает: -Как мы его! Ведь антресоли-то у меня и нету, а искать-то больше и негде!!!
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.04.2017, 15:38  [ТС]
Да я про указатель на наследника понимаю. Меня с толку сбивает упоминание о базовом классе в оригинальном тексте книги.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.04.2017, 15:43
Цитата Сообщение от daslex Посмотреть сообщение
Меня с толку сбивает упоминание о базовом классе в оригинальном тексте книги.
Какая именно, фраза?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.04.2017, 15:48  [ТС]
Это:
Цитата Сообщение от daslex Посмотреть сообщение
программа будет ожидать, что объект базового класса содержит свойства производного класса
Цитата Сообщение от daslex Посмотреть сообщение
the program would expect the base-class object to have derived-class properties
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.04.2017, 15:52
Цитата Сообщение от daslex Посмотреть сообщение
программа будет ожидать, что объект базового класса содержит свойства производного класса
Так я же только что написал. Указатель наследника это доступ к наследнику. А наследник шире родителя может быть. И он м ожет иметь их "аж целых несколько". Попытка прочесть такое поле по указателю хоть методом хоть прямо, это обращение к свойству, которого нет. Конечно, фраза о том, что программа, что-то ожидает выдаёт некоторую литературную утонченность автора. Он мог бы написать, что указатель предоставляет доступ к свойствам, которые отсутствуют физически, например. Но тут уж не взыщите. Имеет смысл выбирать автора, наиболее близкого по стилю.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.04.2017, 15:54  [ТС]
Ничего, что объект базового класса и указатель на наследника по природе своей вообще различные существа?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.04.2017, 15:59
Цитата Сообщение от daslex Посмотреть сообщение
Ничего, что объект базового класса и указатель на наследника по природе своей вообще различные существа?
Это Вы о чём? О не совершенстве бытия? Так int и double это тоже
Цитата Сообщение от daslex Посмотреть сообщение
вообще различные существа
но преобразование есть. Причём расширенное - неявно реализовано. Даункастинг в иерархии есть как таковой, но автор предупреждает о последствиях. По-моему, он делает благородное дело.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.04.2017, 16:14  [ТС]
Я читаю в прямом смысле буквально. В итоге не вижу вот этого:
программа ожидает, что объект базового класса содержит свойства производного класса
Не вижу, потому что объект базового класса, как таковой, тут никак не замешан.
Так же я не вижу, что программа что-то ожидает необычного от объекта базового класса.
Я могу видеть только то, что человек ошибочно может предположить, что в производном классе будут доступны поля, которые для самого производного класса описаны, но из-за зарождения насильственным способом, применённым к объекту базового класса, по факту не существующие.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
14.04.2017, 16:30
Цитата Сообщение от daslex Посмотреть сообщение
Не вижу, потому что объект базового класса, как таковой, тут никак не замешан.
Как же он не замешан, когда его адрес используется? Но так как указатель производного класса, то компилятор (программа) никак не будет возражать на обращение к несуществующим, по этому адресу, свойствам объекта. Это и означает (по Прата):
"программа ожидает, что объект базового класса содержит свойства производного класса"
Цитата Сообщение от IGPIGP Посмотреть сообщение
Конечно, фраза о том, что программа, что-то ожидает выдаёт некоторую литературную утонченность автора.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.04.2017, 17:25  [ТС]
С каких это пор адрес объектом стал?

Добавлено через 52 минуты
Жертва грабителя банка точно также замешана в преступлении, как в обговариваемом примере объект базового класса замешан в плохом поведении программы.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
14.04.2017, 17:55
Цитата Сообщение от daslex Посмотреть сообщение
С каких это пор адрес объектом стал?
По адресу, который в p2, что находится? Хрен с горы или объект базового класса?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.04.2017, 18:53  [ТС]
Жертва преступника тоже в банке находится, когда грабитель грабит людей забредших в банк. Посадим же в темницу сырую всех, справедливости ради.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.04.2017, 19:00
Цитата Сообщение от daslex Посмотреть сообщение
Жертва преступника тоже в банке находится, когда грабитель грабит людей забредших в банк.
Если по комиксам судить о морали бессмертных произведений Гомера, Шекспира, Праты... то я бы предложил Бэтмана. Там есть паутина и динамика.
Цитата Сообщение от daslex Посмотреть сообщение
Не вижу, потому что объект базового класса, как таковой, тут никак не замешан.
А косвенная адресация? Вы в курсе, что не только имя массива используется как адрес? Имя объекта класса, структуры или массива, это адрес относительно которого вычисляются смещения на соответствующие поля. Адрес самого объекта указанный явно не слишком отличается.
Тут есть очевидный выход. Не читайте книжки Пратта.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.04.2017, 19:43  [ТС]
Первое - не понял.
Второе - в курсе. Опять же, объект базового класса ни при чём, он только жертва обстоятельств. И именно он страдает, потому что все (насколько я могу сейчас оценить), включая Прата и других толковых специалистов, обвиняют объект базового класса в принесении беды, мол программа от него чего-то ждать будет такого, что он дать не сможет, вот только именно от объекта базового класса ничего программа ждать не будет, а от объекта, созданного в результате опасного приведения, будет ждать столько же, сколько футбольные болельщики от футболистов России ждут. Объект, созданный в результате приведения, и имеющий тип производный класс не является объектом базового класса, хоть и указывается ему начало объекта базового - он другой объект. Адрес - это адрес. Объект - объект.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.04.2017, 19:59
Цитата Сообщение от daslex Посмотреть сообщение
Объект, созданный в результате приведения,
Если указатель считать объектом то да. Но речь идет не о наследовании указателей и поэтому вы не хотите представить то, что вам говорят. Пратте от этого не холодно ни жарко.
Последний раз:
При приведении указателя создаётся указатель. Объекты остаются прежними (кроме указателя как объекта). Потом указатель предоставляющий доступ в соответствии с типом становится потенциально опасен. Это могло бы звучать для родителя так:
Назвался производным, - полезай в наследника. // там останется много места не принадлежащего родителю, но указатель не знает об этом и будет тупо адресовать если его попросят.
Сентенции о том, что программа/компьютер/реальный мир не виноваты, а виноват пользователь/кодер тут не причём. Это та же литература.
Тут правильно сказали. Повторите указатели. Потом приведение указателей. Фразы вроде "я в курсе" не катят.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.04.2017, 20:17  [ТС]
У Прата есть технические неточности и недоговорённости, причём недоговорённости такие, какие лучше бы озвучены были.
Я же написал, что читаю буквально. Здесь имеет место техническая неточность.

А то, что Вы мне тут сейчас доказываете, что адрес один, значит и объект один - фигня всё.
Я не хочу представить сиё, потому что в таком искажённом виде, какой мне сейчас подаётся, представлять информацию не есть гуд.

Мне не важно, холодно Прата или тепло, чихает ли он из каждого о нём упоминаия или нет.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.04.2017, 20:19
Цитата Сообщение от daslex Посмотреть сообщение
А то, что Вы мне тут сейчас доказываете, что адрес один, значит и объект один - фигня всё.
Фигня это другое. Счастливо оставаться.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.04.2017, 20:29  [ТС]
Ещё раз говорю, фигня это всё.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <new>
 
using namespace std;
 
int main() {
 
   double *a= new double{200};
   int *b = new(a) int{256};
 
   cout << a << " == " << b << "\n";
   cout << *a << " == " << *b << "\n";
 
   delete a;
}
Один адрес. Трактаты разные.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
14.04.2017, 23:08
Цитата Сообщение от daslex Посмотреть сообщение
А то, что Вы мне тут сейчас доказываете, что адрес один, значит и объект один - фигня всё.
Я не хочу представить сиё, потому что в таком искажённом виде, какой мне сейчас подаётся, представлять информацию не есть гуд.
Еще раз говорю - освойте сначала указатели а потом уже пытайтесь ООП а тем более даункастинг осваивать.
Если бы вы четко понимали что указатель это адрес ячейки и как следствие тот факт что то что находится в этой ячейке никак не зависит от того как код ее содержимое интерпретирует код у вас бы подобных вопросов не возникало бы.

Добавлено через 23 минуты
Цитата Сообщение от daslex Посмотреть сообщение
Один адрес. Трактаты разные.
Только то что в примере сответствует кое чему другому.
А именно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <new>
 
using namespace std;
 
int main() {
 
   double *a= new double{200};
   int *b = (int*) a ;
 
   cout << (*a) << " == " << (*b) << "\n";
 
   delete a;
}
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
14.04.2017, 23:32  [ТС]
Я тут один говорю, что адрес - это адрес, вообще-то.
Все дружно пишут, что адрес - объект.
Нет, не объект. А то, что он объект - полная фигня.

И в примере это прослеживается.
Напрямую зависит - конкретный объект интерпретируется как конкретный объект, а не как дяд Вася с хаты с краю.
Базовый класс интерпретируется как базовый класс. Производный как производный и базовым классом не является, несмотря на то, что два разнотипных указателя в одной точке сходятся.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2017, 23:32

Прата задача 6.9
Всем доброго времени суток, подскажите как сделать что бы программа в строке 32 принимала имена с пробелами. Если открываю файл без...

C++ - Прата задача 6.9
Подскажите пожалуйста в чем ошибка?не обрабатывается условие неправильного ввода имени файла. #include &lt;iostream&gt; #include...

Прата, задача 2, глава 6
Доброго времени суток. Учу программирования по книжке Прата. И вот такая задача: &quot;Напишите программу, которая считывает до десяти...

Прата, аргументы по умолчанию
Тема - аргументы по умолчанию. Приведён код #include &lt;iostream&gt; const int ArSize = 80; char * left(const char * str, int n = 1); ...

Прата -> Шлее = PROFIT?
Изучением программирования занялся от безделья. Путём гугления выбрал С++. В качестве первой книги - Стивен Прата &quot;Язык...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Как замкнутый ядерный цикл решит проблему недостатки фосфора? Био миграция фосфора со дна океана
anaschu 26.06.2026
Биологический лифт: Концепция подъема фосфора со дна океана с помощью ЗЯТЦ Предлагаю на обсуждение альтернативу тяжелому промышленному бурению океанического дна. Вместо сложной инженерии мы можем. . .
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru