powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кастинг вверх
43 сообщений из 43, показаны все 2 страниц
Кастинг вверх
    #38077557
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внутри двух моих соседних тем 13615394 про автодроп и 13615394 про неявность образовалась одна лемма, которую я решил вынести в отдельный пост, потому что там и так уже замес по полной программе)))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <iostream>
using namespace std;

class A { public: int a; A() { a = 5; }} ;
class B : public A { public: int b, c; B() : A() { b = 6, c = 7; }}; 

int main()
{
    B* b = (B*) new A;
    cout << b->a << endl; // 5
    cout << b->b << endl; // 0 ))) 
    cout << b->c << endl; // 131074 )))
    return 0;
}



Короче, есть желание разобраться что происходит, когда мы сишно ака грязно кастим родителя в дочку. Возникает два вопроса:

1. грязь свеху (b=0, c=131074) это просто грязь из свободной памяти и и тогда все ок, или это кусок от какого-то реального объекта и мы кому-то реально что-то поломали в своей же программе??

2. если это просто грязь, то какой самый простой способ тупо занулить этот оверхед??

3. какие существуют самые простые, безболезненные, экономичные и безопасные методы неявного кастинга вверх, когда кастируемый объект занимает меньший объем, чем кастоприемник??
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077600
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, ты меня просто поражаешь своей скоростью продуцирования бредовых идей.
Самое интересное как тебя самого не корчит от противоречий и нарушений базовых
правил?

Ну что это такое за мерзость ты написал? Что это за даункастинг в первой строке?
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077621
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Думаю, возможно два варианта, первое, или это человек с идиосинкразией к обучению, или что это тролль, не осознавший еще что он тролль. В любом случае предлагаю не обсуждать подобный код, по вполне практичным соображениям: поиск по форуму пополнится очередной ахинеей, снизится добротность форума, и судя по предыдущим топикам, человек не в состоянии понять что ему советуют.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077641
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, твой код примерно соответствует:
Код: plaintext
1.
2.
3.
4.
5.
    int *a= new int[1];
    a[0]=5;
    cout << a[0] << endl;
    cout << a[1] << endl;
    cout << a[2] << endl;
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077774
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу что это такое за мерзость ты написал?

Это наезд? )))

maytonЧто это за даункастинг в первой строке?

Я бы скорее назвал это апкастингом, если уж на то пошло. Даункастинг это так:
Код: plaintext
1.
A* a = (A*) new B;
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077778
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_,

чё обиделись на меня что-ли?...
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077781
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixКороче, есть желание разобраться что происходит, когда мы сишно ака грязно кастим родителя в дочку. Возникает два вопроса:


Происходит UB (undefined behavior), т.е. поведение программы непредсказуемо.
Если реального обращения с b как с B не будет, скорее всего, ничего не будет.
Если попытаются реально к b обратиться как к B, а не A, скорее всего, будет защита памяти и крах программы.

Lumix1. грязь свеху (b=0, c=131074) это просто грязь из свободной памяти и и тогда все ок, или это кусок от какого-то реального объекта и мы кому-то реально что-то поломали в своей же программе??


Это может быть всё что угодно, чаще всего, это либо какой-то мусор (слючайно заполненные данные) или защита памяти, если OS эту память защищает. Но это не вопрос С++, это вопрос реализации, как там сделано, и какой объект (тут он динамический, но такое может быть с объектом любого класса памяти).

Lumix2. если это просто грязь, то какой самый простой способ тупо занулить этот оверхед??

3. какие существуют самые простые, безболезненные, экономичные и безопасные методы неявного кастинга вверх, когда кастируемый объект занимает меньший объем, чем кастоприемник??


0) это не просто грязь, это вообще не грязь, это UB -- т.е. твоя программа попросту невалидна. Как она при этом будет работать -- неизвестно.

1) это не кастинг вверх, это кастинг вниз. Он так и называется -- downcast, в безопасном варианте -- type-safe downcast.
Кастинг вверх всегда безопасен. Кастинг вниз требует проверки реального типа объекта.

2) единственный и он же безопасный метод выполнения downcast -- делать его всегда type-safe downcast. В С++ это dynamic_cast или его проприетарные аналоги из разных библиотек, которые реализуют по сути тот же dynamic_cast своими методами.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077783
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_mayton,

Думаю, возможно два варианта, первое, или это человек с идиосинкразией к обучению, или что это тролль, не осознавший еще что он тролль. В любом случае предлагаю не обсуждать подобный код, по вполне практичным соображениям: поиск по форуму пополнится очередной ахинеей, снизится добротность форума, и судя по предыдущим топикам, человек не в состоянии понять что ему советуют.

Давайте без наездов.

Явно видно, человек учится, только ему просто не у кого учиться.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077786
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_SlaLumix, твой код примерно соответствует:
Код: plaintext
1.
2.
3.
4.
5.
    int *a= new int[1];
    a[0]=5;
    cout << a[0] << endl;
    cout << a[1] << endl;
    cout << a[2] << endl;



Ок, понял.

А в этом случае a[1] и a[2] чью-то конкретную память берут (какого-то живого объекта) или свободную, ничейную?? Это просто неэтичная операция или кастиг вверх может уронить программу??
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077819
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это по уровню идиотизма аналог кода был. Да, согласен.

Lumix
Ок, понял.

А в этом случае a[1] и a[2] чью-то конкретную память берут (какого-то живого объекта) или свободную, ничейную??


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

LumixЭто просто неэтичная операция или кастиг вверх может уронить программу??


Может уронить, и очень легко в современных системах.
Если объект динамически созданный, как в твоём примере, то это почти 100% крах программы в современных операционках и компиляторах.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077826
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)LumixЯ бы скорее назвал это апкастингом, если уж на то пошло. Даункастинг это так:
Код: plaintext
1.
A* a = (A*) new B;


Нет.

2)
Следующее выражение перепиши с использованием dynamic_cast.

Код: plaintext
1.
B* b = (B*) new A;



И расскажи что случилось в runtime.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077857
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЕсли реального обращения с b как с B не будет, скорее всего, ничего не будет.

ок, понятно

MasterZivЕсли попытаются реально к b обратиться как к B, а не A, скорее всего, будет защита памяти и крах программы.

ок, понятно


MasterZiv0) это не просто грязь, это вообще не грязь, это UB -- т.е. твоя программа попросту невалидна. Как она при этом будет работать -- неизвестно.

понятно...
тогда и затирание оверхеда нулями тоже бессмсленный шаг...

блин, тогда получается любой кастинг вниз чтобы защититься от UB вынуждает нас создавать новый объект, в который мы кастим, копировать кастируемый объект и потом затирать старый, если он не нужен


MasterZiv1) это не кастинг вверх, это кастинг вниз. Он так и называется -- downcast, в безопасном варианте -- type-safe downcast.
Кастинг вверх всегда безопасен. Кастинг вниз требует проверки реального типа объекта.

2) единственный и он же безопасный метод выполнения downcast -- делать его всегда type-safe downcast. В С++ это dynamic_cast

ок, с направлением разобрался
спасибо за ключевое слово type-safe downcast

начал гуглить на тему как спрятать динамиккаст под капот и к удивлению обнаружил, что динамик вполне себе работает с шаредами перегрузка динамика и шареды на stackoverflow

MasterZivили его проприетарные аналоги из разных библиотек, которые реализуют по сути тот же dynamic_cast своими методами.

а динамик под капотом это всегда копирование или он как-то по-хитрому оверхед пришивает ну типа как кусочки файлов на поверхности диска разбросаны, а операционная система имплиситно потом собирает в один??
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077862
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton1)LumixЯ бы скорее назвал это апкастингом, если уж на то пошло. Даункастинг это так:
Код: plaintext
1.
A* a = (A*) new B;


Нет.


да, мне уже объяснили, что направление приращивания идет вниз, то родитель это всегда топ.
из-за "мерзость" я подумал даункастинг в смысле "ты чё даун что ли?"
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077872
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivLumixА в этом случае a[1] и a[2] чью-то конкретную память берут (какого-то живого объекта) или свободную, ничейную??


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


Ок, понятно

MasterZivLumixЭто просто неэтичная операция или кастиг вверх может уронить программу??


Может уронить, и очень легко в современных системах.
Если объект динамически созданный, как в твоём примере, то это почти 100% крах программы в современных операционках и компиляторах.

Ок, понятно
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077875
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix, ну вот погугли по RTTI, downcasting, dynamic_cast..

Не обижайся! Но со стороны звучит так. " - Ребят я тут с утра поел немного говна навоза. И у меня болит живот.
Откуда у меня в животе интоксикация? "...

Сам ведь себе Злобный Буратино.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077889
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
2)
Следующее выражение перепиши с использованием dynamic_cast.

Код: plaintext
1.
B* b = (B*) new A;



И расскажи что случилось в runtime.

Я конечно сейчас попробую, но меня пока пугает, что динамик требует виртуалок в базе, а у нас доступа к базе нет, мы от базы просто наследуемся и соотв. динамик к ней применять может не получиться...
Код: plaintext
1.
2.
3.
4.
A* get A(); // внешняя либа, не наша
class B : public A { };
shared_ptr<b>& b() { .... }
b() = dynamic_cast<B>(getA()); // требует виртуалок А...



Про как спрятать это хозяйство под капот я тему не трогаю, потому что эта тема конкретно про даункастинг
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077908
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе обижайся!

я и не обижаюсь. Я лишь выяснял вопрос насчет наездов и обид с одной целью: можно ли мне продолжать поиск или уйти из темы, чтобы не нервировать людей, ведь там были предложения "а давайте тему игнорить!!"

я сюда не троллить прихожу, а решать вопросы, которые я вообще нигде больше решить не могу ну и я заранее знаю, что реакция может быть разной...

причем я не обращаюсь с какими-то реальными кусками кода на 20 экранов, а четко вычленяю вопрос, превращаю его в минимальнейший пример и уже с ним иду на форум...

с тем же даункастингом
я ведь реально подумал, что это такой наезд, что типа я даун, а оказалось что это реальный термин такой!! )))

я помню фильм был какой-то старый с Вуппи Голберг. она там тренировала баскетбольную команду и назвала чувака негра, который был в защите, назвала его black hole, он подумал что это расистский наезд, а оказалось, что она имела ввиду черную дыру, которая в космосе, в которой все исчезает...
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077917
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixя ведь реально подумал, что это такой наезд, что типа я даун, а оказалось что это реальный термин такой!! )))
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077950
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

уважаемый Lumix, все делается для того чтобы обратить ваше внимание на те вещи на которых вам следует сконцентрироваться. В том числе на изучении базовых элементов, принципов, конструкций языка. А "наезды" (здесь и в соседних топиках), это своего рода порки, которые вы заслужили. Кстати обижаться на вас никто не собирается, этого как раз вы еще не заслужили.

Прежде чем спорить и отвечать на советы, попытайтесь как минимум понять, осмыслить что вам пишут, и тем более то что пишите вы. И все будет тип-топ. Обещаю.

Совсем дружеский совет, без всяких обиняков. Прочитайте книжку. Если надо срочно решать проблему, такое бывает, да, прочитайте нужный раздел.

ЗЫ с обиняками. Не употребляйте столько непонятных терминов. Вы заставляете наши эго корчиться от осознания собственной ничтожности.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077955
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixа динамик под капотом это всегда копирование или он как-то по-хитрому оверхед пришивает ну типа как кусочки файлов на поверхности диска разбросаны, а операционная система имплиситно потом собирает в один??нет, динамик каст это всегда проверка на допустимость, если приведение невозможно, то динамик каст вернёт 0. смотри:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class A { virtual ~A() {} };
class B : public A { virtual ~B() {} };

A *a = new A;
A *b = new B;
B *c = dynamic_cast< B*>( a );  // здесь c == 0, потому что (*a) не является объектом класса B
B *d = dynamic_cast< B*>( b );  // здесь d == b, потому что (*b) - является объектом класса B

и, для того, чтобы воспользоваться возможностями dynamic_cast, тебе необходимо иметь в классе хотя бы одну виртуальную функцию

Но на самом деле, тебе не нужен такой кривой каст. Всё, что тебе нужно - это сделать твой globalStorage указателем на базовый класс ( class A, в твоих примерах ) и функцию b() сделать возвращающей тип A*, и тогда ты 100% гарантируешь, что с любым объектом, который она вернёт, работа возможна только в рамках интерфейса базового класса.

Возвращаясь к посылу именно этого треда, то, если малька перезаточить твой исходный пример, то падения можно добиться прямо не отходя от кассы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include <iostream>
using namespace std;

class A { public: int a; A() { a = 5; }} ;
struct B : public A 
{ 
	int *b, *c; 
	B() : A(), b( new int( 6 ) ), c( new int( 7 ) ) {} 
	virtual ~B() { delete b; delete c; }
}; 

int main()
{
 	B* b = (B*) new A;
	cout << &b->a << " " << b->a << endl; 
	cout << &b->b << " " << b->b << " " /*<< *b->b*/ << endl;  // закомментированный кусок приводит к падению
	cout << &b->c << " " << b->c << " " /*<< *b->c*/ << endl;  // или не приводит, что ещё хуже
	return 0;
}
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077976
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_, ну ладно уж, воспитатель прям. Человек ведь задаёт вопросы, и постепенно, приходит к пониманию.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38077988
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixно меня пока пугает, что динамик требует виртуалок в базе, а у нас доступа к базе нет, мы от базы просто наследуемся и соотв. динамик к ней применять может не получиться...вообще говоря, если в базе нет виртуального деструктора, то наследоваться от такого класса категорически не рекомендуется, потому что вероятность утечки памяти практически 100%.
Если это действительно так, то следует вместо наследования использовать агрегацию.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38078006
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня уже в голове созрела книга под названием "Вы можете сделать это в С++, но этого делать нельзя."
...
Рейтинг: 0 / 0
Кастинг вверх
    #38078035
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня уже в голове созрела книга под названием "Вы можете сделать это в С++, но этого делать нельзя."

где можно оставить предзаказ? ;)
...
Рейтинг: 0 / 0
Кастинг вверх
    #38078047
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychLumixно меня пока пугает, что динамик требует виртуалок в базе, а у нас доступа к базе нет, мы от базы просто наследуемся и соотв. динамик к ней применять может не получиться...вообще говоря, если в базе нет виртуального деструктора, то наследоваться от такого класса категорически не рекомендуется, потому что вероятность утечки памяти практически 100%.
Если это действительно так, то следует вместо наследования использовать агрегацию.

Вот это да!! Охренеть!!
А это правило распространяется на наследников третьего и глубже уровней??

Код: plaintext
1.
2.
3.
4.
5.
6.
class U {};
class D : public U {}; // опасно!!

class A { public: virtual ~A(){};};
class B : public A { public: ~B(){}; }; // безопасно
class C : public B {}; // опасно или безопасно??
...
Рейтинг: 0 / 0
Кастинг вверх
    #38078056
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня уже в голове созрела книга под названием "Вы можете сделать это в С++, но этого делать нельзя."ну, ты немного запоздал ;-))
вот несколько подобных: верёвка достаточной длины... , скользкие места C++ , неидеальный C++ . вероятно, есть и другие
...
Рейтинг: 0 / 0
Кастинг вверх
    #38078070
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixВот это да!! Охренеть!!
А это правило распространяется на наследников третьего и глубже уровней??на всех. собственно, он ( виртуальный деструктор ) требуется, если удаляется наследник через указатель базового класса. если где-то в иерархии есть невиртуальный деструктор, то удаление на нём прекратится и не будут вызваны деструкторы наследников, поэтому есть рекомендация _всегда_ в классе делать виртуальный деструктор, на автомате.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38078110
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychи, для того, чтобы воспользоваться возможностями dynamic_cast, тебе необходимо иметь в классе хотя бы одну виртуальную функцию

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


egorychНо на самом деле, тебе не нужен такой кривой каст. Всё, что тебе нужно - это сделать твой globalStorage указателем на базовый класс ( class A, в твоих примерах ) и функцию b() сделать возвращающей тип A*, и тогда ты 100% гарантируешь, что с любым объектом, который она вернёт, работа возможна только в рамках интерфейса базового класса.

если бы не стояло задачи как в аксессор наследника можно вставить экземпляр базы (родителя), то и всех этих трех тем не было бы вообще

egorychВозвращаясь к посылу именно этого треда, то, если малька перезаточить твой исходный пример, то падения можно добиться прямо не отходя от кассы:

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

Итого получается: грязный даункастинг делать запрещено, потому что UB, а чтобы делать чистый (динамик) кастинг нужна хотя бы одна виртуальная функция и если класс не наш, тогда единственный честный даункастинг возможен только ручным почленным копированием типа прототипирования, что пользователи делать никогда не станут, значит сама идея подсовывания родителя вместо дочки принципиально обречена на фейл.

с одной стороны печально, но с другой стороны стало понятно что к чему...
...
Рейтинг: 0 / 0
Кастинг вверх
    #38078117
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychLumixВот это да!! Охренеть!!
А это правило распространяется на наследников третьего и глубже уровней??на всех. собственно, он ( виртуальный деструктор ) требуется, если удаляется наследник через указатель базового класса. если где-то в иерархии есть невиртуальный деструктор, то удаление на нём прекратится и не будут вызваны деструкторы наследников, поэтому есть рекомендация _всегда_ в классе делать виртуальный деструктор, на автомате.

ок, понятно
...
Рейтинг: 0 / 0
Кастинг вверх
    #38078119
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychmaytonУ меня уже в голове созрела книга под названием "Вы можете сделать это в С++, но этого делать нельзя."ну, ты немного запоздал ;-))
вот несколько подобных: верёвка достаточной длины... , скользкие места C++ , неидеальный C++ . вероятно, есть и другие

Про веревеку прочту в выходные, когда время свободное будет!!
...
Рейтинг: 0 / 0
Кастинг вверх
    #38079023
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итого получается: грязный даункастинг делать запрещено, потому что UB, а чтобы делать чистый (динамик) кастинг нужна хотя бы одна виртуальная функция и если класс не наш, тогда единственный честный даункастинг возможен только ручным почленным копированием типа прототипирования, что пользователи делать никогда не станут, значит сама идея подсовывания родителя вместо дочки принципиально обречена на фейл.

с одной стороны печально, но с другой стороны стало понятно что к чему...


Мне искренне жаль, что вроде бы очевидные мысли до тебя с такими муками доходят.

Не обижайся. Просто видимо в твоем образовании компьютерном были какие-то пробелы, которые и были причиной этого. Это даже не обязательно твоя вина...

Мне бы со своей стороны очень хотелось узнать, где же эти пробелы, чтобы можно было как-то их компенсировать...

На мой взгляд это должно быть непонимание модели памяти компьютера и конкретного языка и незнание адресной арифметики.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38079039
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О ограничениях downcast...

0) для работы dynamic cast действительно требуется хотябы одна виртуальная функция. Достаточно виртуального деструктора.
1) есть еще другие способы выполнить type safe down cast. Самый простой — просто знать, что в этом месте программы тип какой надо, либо, более универсально, завести в классе поле — тип объекта, и проверять его.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38079105
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivМне искренне жаль, что вроде бы очевидные мысли до тебя с такими муками доходят.

Да привык я уже за много лет...
я кстати при этом не особо и мучаюсь
знаете, обучать молодого парня продажам это гораздо больше мук!!

MasterZivНе обижайся. Просто видимо в твоем образовании компьютерном были какие-то пробелы, которые и были причиной этого. Это даже не обязательно твоя вина...

Я и не обижаюсь. У меня отсутствует формальное образование в области программирования. Мне как в 91 году родители подарили 286 компьютер, так с тех пор я все изучаю самоучкой ну или в результате общения, как тут на форумах. Мои родители всегда были против того, чтобы я занимался программированием как основным источником дохода, поэтому мне пришлось выучиться на экономиста и 80% денег я делаю не в программировании. Программирование это только один из моих бизнесов, потому что мои деловые связи в других бизнесах позволяют легко находить клиентов сразу по ходу. Например, ведем переговоры по товарам, а потом за обедом у коммерческого директора компании, которой мы продаем товары, я узнаю не надо ли чего накодить и оказывается, что можно и накодить, вот моя команда и подключается "в игру". Кто не в курсе, по-научному это называется кросс-сейл.

Я получаю реально крутые ощущения от работы в этом проекте. Кто-то из мужиков на рыбалку ездит, кто-то бухает беспробудно, кто-то в большой теннис играет, кто-то бильярд, а я кайфую от кодинга. К тому же вся его прелесть, что можно и в командировке и где угодно этим заниматься, все что надо это ноут с интернетом, а сервера нашей команды работают 24/7.

MasterZivМне бы со своей стороны очень хотелось узнать, где же эти пробелы, чтобы можно было как-то их компенсировать...

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

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

Насчет пробелов...
дело в том, что мне оооочень тяжело дается образование в форме типа вот так http://www.youtube.com/watch?v=atVgLRzl3rI
...
Рейтинг: 0 / 0
Кастинг вверх
    #38079399
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги. Прошу вас оставаться в контексте форума и топика.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38079682
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv1) есть еще другие способы выполнить type safe down cast. Самый простой — просто знать, что в этом месте программы тип какой надо, либо, более универсально, завести в классе поле — тип объекта, и проверять его.

Я вчера на примере, который дал Егорыч, где дата-мемберы хранятся через указатели, я впервые понял, что хранение объекта в памяти похоже на тузика после взрыва. Я всю жизнь думал, что если class B : public A, то просто есть участок памяти где сначала идет А, а потом идет В типа так

ААААААААААААААААААBBBBBBBBBBBBBB.............................

а оказалось, что если есть указатели, то на самом деле все это хранится примерно вот так

ААААААВВВВВВВ.......ААА......ААА....ВВВ.......ВВВ.....АААА........ВВВВВВВВ......АА...ВВ...ВВВ.....АААА.....

потом я прочитал, что такое deep copy constructor и вообще впал в печаль...

почему же на уровне языка и стандартной либы не придумали инструменты, которые позволяли ли создать пустую поиниченную дочку и в участок, который приходится на родителя подсунуть точную глубокую копию другого родителя, ведь вручную все это мутить это же просто капец!!
...
Рейтинг: 0 / 0
Кастинг вверх
    #38080368
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Насчет пробелов...

Так на счёт пробелов -- уже всё понятно. Раз вообще нет спецобразования -- тут
не пробелы, тут сплошные заснеженные поля...
Не, хорошо, что врубаешься...

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Кастинг вверх
    #38080425
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
> Насчет пробелов...

Так на счёт пробелов -- уже всё понятно. Раз вообще нет спецобразования -- тут
не пробелы, тут сплошные заснеженные поля...
Не, хорошо, что врубаешься...



чё-то я чем больше врубаюсь тем больше вспоминаю соломоново изречение, что знания преумножают скорбь ))))
чем больше узнаю, тем больше какой-то скрытый внутренний страх появляется... страх сделать что-то не так...
...
Рейтинг: 0 / 0
Кастинг вверх
    #38080697
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>
> Я вчера на примере, который дал Егорыч, где дата-мемберы хранятся через
> указатели, я впервые понял, что хранение объекта в памяти похоже на тузика после
> взрыва. Я всю жизнь думал, что если class B : public A, то просто есть участок
> памяти где сначала идет А, а потом идет В типа так

Ты думал правильно.


> а оказалось, что если есть указатели, то на самом деле все это хранится примерно
> вот так
>
> ААААААВВВВВВВ.......ААА......ААА....ВВВ.......ВВВ.....АААА........ВВВВВВВВ......АА...ВВ...ВВВ.....АААА.....

Если есть указатели, то данные, которые храняться вовне объекта класса -- это не
всегда уже этот объект. На самом деле это так только если данный объект выделяет
динамически другой объект и владеет им (подобъект является неотемлимой
частью надобъекта).

Если там просто указатель, то это может быть уже просто ссылка (ассоциация) с
другим объектом.

>
> потом я прочитал, что такое deep copy constructor и вообще впал в печаль...
>

Да там всё просто ...

> почему же на уровне языка и стандартной либы не придумали инструменты, которые
> позволяли ли создать пустую поиниченную дочку и в участок, который приходится на
> родителя подсунуть точную глубокую копию другого родителя, ведь вручную все это
> мутить это же просто капец!!


Потому что семантика того, что ты назвал "глубоким копированием" неоднозначна и
может быть разной. Семантика агрегации в объекте данных по значению наоборот
однозначна, поэтому она и реализована в языке.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Кастинг вверх
    #38080703
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixААААААВВВВВВВ.......ААА......ААА....ВВВ.......ВВВ.....АААА........ВВВВВВВВ......АА...ВВ...ВВВ.....АААА.....
Может так?

ААААААВВВВВВВ.......ССС......DDD....EEE.......FFF.....GGG........HHHHHHHH......II...KKK...LLL.....MMMM....

Т.е. дело не в том, что манатки, на которые ты ссылаешься, хранятся где угодно. А в том, что ты необоснованно считаешь частью объекта, который на них ссылается. И отсюда ожидаешь, что кто-то как-то их сложит в стройную кучку. А кто это это сделает? Снова менеджер памяти должен проявить доблестный интеллект? Нет.

Но ты можешь сделать это сам. Устрой собственный менеджмент памяти.
...
Рейтинг: 0 / 0
Кастинг вверх
    #38080706
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, логичный вопрос. Объект A ссылается на C. И объект B ссылается на С. Ну и к кому из них это C "прилепить" в памяти?
...
Рейтинг: 0 / 0
Кастинг вверх
    #38080750
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЕсли есть указатели, то данные, которые храняться вовне объекта класса -- это не
всегда уже этот объект.
Да, это ещё одна моя многолетняя иллюзия!! Действительно вы правы, так считать абсолютно неправомерно.

Код: plaintext
1.
2.
3.
4.
5.
class A { public: int* p; };
int a;
A a1, a2;
a1.p = &a;
a2.p = &a;



и чей теперь int a сказать уже нельзя....
действительно, вы абсолютно правы!

MasterZiv>
> потом я прочитал, что такое deep copy constructor и вообще впал в печаль...
>

Да там всё просто ...

я впал в печаль, что автоматизмом там не очень пахнет, особенно теперь, когда я перестал считать объект, хранимый по указателю частью объекта...

MasterZivПотому что семантика того, что ты назвал "глубоким копированием" неоднозначна и
может быть разной. Семантика агрегации в объекте данных по значению наоборот
однозначна, поэтому она и реализована в языке.



да, да, да, да, все это так, так, так
...
Рейтинг: 0 / 0
Кастинг вверх
    #38080755
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonLumixААААААВВВВВВВ.......ААА......ААА....ВВВ.......ВВВ.....АААА........ВВВВВВВВ......АА...ВВ...ВВВ.....АААА.....
Может так?

ААААААВВВВВВВ.......ССС......DDD....EEE.......FFF.....GGG........HHHHHHHH......II...KKK...LLL.....MMMM....

Т.е. дело не в том, что манатки, на которые ты ссылаешься, хранятся где угодно. А в том, что ты необоснованно считаешь частью объекта, который на них ссылается. И отсюда ожидаешь, что кто-то как-то их сложит в стройную кучку. А кто это это сделает? Снова менеджер памяти должен проявить доблестный интеллект? Нет.

Да, вы абсолютно правы. Я много лет считал такие объекты, которые хранятся по указателю частью самого объекта, а так считать абсолютно неправомерно

собственно там внутри темы, когда мы обсуждали как удалить изнутри new MasterZiv обратил мое внимание, что объект в памяти вообще не имеет отношения к указателю, что указатель имеет, а объект не имеет

я теперь очень четко представил себе как это выглядит на самом деле и чисто эмоционально мне очень трудно это принять. я ощущаю себя как герой сериала, которому сказали: Бето, я должна тебе сказать, что Дон Хуан насамом деле твой отец. Вроде все понятно, а свыкнуться с этим положением вещей надо некоторое время


Edd.DragonНо ты можешь сделать это сам. Устрой собственный менеджмент памяти.

Да, придется вводить какие-то правила типа один объект один указатель один владелец. В общем что-нибудь придумаю, главное, что теперь у меня наступила ясность как там все на самом деле происходит!!! эти ошмётки меня конечно мало радуют, но лучше правда, чем иллюзии...
...
Рейтинг: 0 / 0
Кастинг вверх
    #38080759
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonСобственно, логичный вопрос. Объект A ссылается на C. И объект B ссылается на С. Ну и к кому из них это C "прилепить" в памяти?

Собственно говоря когда-то давно я ввел систему аксессоров точно по этой же самой причине!! Было вообще непонятно что в каком классе хранить и я принял решение да пошло все нахер!! если пользователь не знает в чем ему хранить пусть хранит вообще в отдельном классе и этот класс будет доступен через аксессор в любом другом классе

поэтому вашу задачу про ссылающиеся друг на друга объекты мы решили через акссесоры: есть три класса A, B, C и у них есть три аксессора a(), b(), c() и теперь никто ни на кого не ссылается, каждый живет сам по себе и из каждого класса можно вызывать любой их этих классов через аксессор, полностью забивая болт тему взаимных связей между ними!!
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кастинг вверх
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]