Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/30: Рейтинг темы: голосов - 30, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 18.09.2018
Сообщений: 4

Восходящее преобразование массива производного класса к родительскому?

03.01.2020, 22:54. Показов 6985. Ответов 114

Студворк — интернет-сервис помощи студентам
Есть два класса base_Class(родитель) и derived_Class(потомок)
Есть некая виртуальная функция в base_Class которая принимает в качестве параметра массив объектов класса f(base_Class **mass)
Чтобы воспользоваться данной функцией для производного класса, необходимо привести массив производного класса к массиву родительского
Массивы: base_Class *baseMass[100], derived_Class *derivedMass[100]
Как произвести такое приведение типов?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2020, 22:54
Ответы с готовыми решениями:

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

Восходящее преобразование
помогите пожайлуста разобраться, почему выдаёт ошибку... public class A{ public int f1(){return 1;}; public int...

Восходящее преобразование, объяснить код
Всем привет! Мне не понятен один момент в восходящем преобразовании. Есть два класса: один базовый, другой производный от базового. В...

114
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 20:00
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
ты ничего не путаешь?
Нет.
Цитата Сообщение от hoggy Посмотреть сообщение
какое отношение твоя ссылка имеет к твоему утверждению?
Самое прямое.
Цитата Сообщение от hoggy Посмотреть сообщение
какое вообще отношение твоя ссылка имеет к strict aliasing rules?
Эм... Ты не в курсе, что называют strict aliasing rule(s)?
Цитата Сообщение от hoggy Посмотреть сообщение
поведение представленного тобою фрагмента кода вполне себе определенно.
а вот что будет дальше,
когда ты попробуешь использовать результат reinterpret_cast<base**>(&dptr) - это вопрос.
Другое дело. А то "[каст] derived** в base** … классифицируется как UB"…
Сам каст — не UB.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2020, 20:22
Цитата Сообщение от rat0r Посмотреть сообщение
http://eel.is/c++draft/basic.lval#11
кстати, почему твой источник не полный?

у тебя там всего 3 варианта легального доступа.


хотя должно быть гораздо больше:

Document Number: N4659
Date: 2017-03-21
Revises: N4640

6.10 Lvalues and rvalues [basic.lval]


8 If a program attempts to access the stored value of an object through a glvalue of other than one of the
following types the behavior is undefined:56
(8.1) — the dynamic type of the object,
(8.2) — a cv-qualified version of the dynamic type of the object,
(8.3) — a type similar (as defined in 7.5) to the dynamic type of the object,
(8.4) — a type that is the signed or unsigned type corresponding to the dynamic type of the object,
(8.5) — a type that is the signed or unsigned type corresponding to a cv-qualified version of the dynamic type
of the object,
(8.6) — an aggregate or union type that includes one of the aforementioned types among its elements or nonstatic data members (including, recursively, an element or non-static data member of a subaggregate or
contained union),
(8.7) — a type that is a (possibly cv-qualified) base class type of the dynamic type of the object,
(8.8) — a char, unsigned char, or std::byte type
http://www.open-std.org/jtc1/s... /n4659.pdf

Добавлено через 5 минут
Цитата Сообщение от rat0r Посмотреть сообщение
Эм... Ты не в курсе, что называют strict aliasing rule(s)?
я то в курсе.
а вот ты похоже - нет.

давай, расскажи нам, что именно называют strict aliasing rule(s)

Цитата Сообщение от rat0r Посмотреть сообщение
Самое прямое.
а я говорю что вообще никакого.
что ты сейчас несешь какой то бред.

Про C++ алиасинг, ловкие оптимизации и подлые баги

Добавлено через 12 минут
Цитата Сообщение от rat0r Посмотреть сообщение
Другое дело. А то "[каст] derived** в base** … классифицируется как UB"…
Сам каст — не UB.
я так и написал.
сам каст - не UB, даже если он некорректный.

однако, если каст - не корректный, то именно он провоцирует UB.
он является причиной всей последующей трагической цепочки событий.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 20:24
Цитата Сообщение от hoggy Посмотреть сообщение
кстати, почему твой источник не полный?
Он полный, в том смысле, что он покрывает все возможные ситуации.
Кликните здесь для просмотра всего текста
Другое дело, что текст слегка кривой, т.к. dynamic type это свойство выражений (http://eel.is/c++draft/defns.dynamic.type, http://eel.is/c++draft/defns.dynamic.type.prvalue), а не объектов. Но в этом смысле разницы между https://timsong-cpp.github.io/... sic.lval#8 и http://eel.is/c++draft/basic.lval#11 нет.

Цитата Сообщение от hoggy Посмотреть сообщение
у тебя там всего 3 варианта легального доступа.
хотя должно быть гораздо больше:
Кому должно? Почему должно?
Цитата Сообщение от hoggy Посмотреть сообщение
я то в курсе.
а вот ты похоже - нет.
Лол…
Цитата Сообщение от hoggy Посмотреть сообщение
а я говорю что вообще никакого.
что ты сейчас несешь какой то бред.
Про C++ алиасинг, ловкие оптимизации и подлые баги
Типа, ссылка доказывает что я не в курсе, а ты — в курсе?
Сам-то пробовал читать, что там написано?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2020, 20:56
Цитата Сообщение от rat0r Посмотреть сообщение
Он полный, в том смысле, что он покрывает все возможные ситуации.
как именно он покрывает следующий кейс:
Цитата Сообщение от hoggy Посмотреть сообщение
(8.7) — a type that is a (possibly cv-qualified) base class type of the dynamic type of the object,
Цитата Сообщение от rat0r Посмотреть сообщение
Кому должно? Почему должно?
не тупи.
если не хочешь нормально общаться - не общайся.
только не нужно тупить.
ты прекрасно понял, что я имел ввиду.

Цитата Сообщение от rat0r Посмотреть сообщение
Типа, ссылка доказывает что я не в курсе, а ты — в курсе?
типа по ссылке - качественный материал.
автор очень толково объясняет,
что за алиасинг такой, и с чем его едят.

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

однако, тот факт что ты тупо проигноировал:
Цитата Сообщение от hoggy Посмотреть сообщение
давай, расскажи нам, что именно называют strict aliasing rule(s)
как бе...
я конечно ничего не хочу сказать.
но это подозрительно.



Цитата Сообщение от rat0r Посмотреть сообщение
Сам-то пробовал читать, что там написано?
да ты за меня не переживай.
ты лучше попробуй объяснить как ты додумался до такого бреда:
Цитата Сообщение от rat0r Посмотреть сообщение
Даже если у base* и der* одинаковый размер, читать значение из объекта типа der* через glvalue с типом base* это банально нарушение т.н. strict aliasing rules.
и мне вот очень интересно:
как по твоему должен работать типичный полиморфизм?

C++
1
2
base* ptr = &der;
work(ptr);
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 21:12
Цитата Сообщение от hoggy Посмотреть сообщение
как именно он покрывает следующий кейс:
(8.7) — a type that is a (possibly cv-qualified) base class type of the dynamic type of the object
А зачем покрывать невозможный кейс???
Цитата Сообщение от http://eel.is/c++draft/basic.lval#11.note-1
[ Note: Unlike in C, C++ has no accesses of class type. — end note]
Нет доступа через glvalue of class type — нет смысла говорить, будет ли behavior (un)defined в случае доступа через glvalue of class type.
Цитата Сообщение от hoggy Посмотреть сообщение
не тупи.
если не хочешь нормально общаться - не общайся.
только не нужно тупить.
ты прекрасно понял, что я имел ввиду.
Нет, не понял. Опять что-то про переход на красный свет?
Если нет, то обоснуй, почему в "моём" источнике должны быть пункты которых там нет.
Цитата Сообщение от hoggy Посмотреть сообщение
типа по ссылке - качественный материал.
автор очень толково объясняет,
что за алиасинг такой, и с чем его едят.
Ты вроде начал с того, что я не знаю, что принято называть strict aliasing rule(s). И кинул ссылку.
Которая подтверждает что моё понимание что называют strict aliasing rule(s) правильное.
Цитата Сообщение от hoggy Посмотреть сообщение
однако, тот факт что ты тупо проигноировал:
давай, расскажи нам, что именно называют strict aliasing rule(s)
как бе...
я конечно ничего не хочу сказать.
но это подозрительно.
По твоей ссылке написано, что именно называют strict aliasing rule(s). И "моя" ссылка этому не противоречит. Так что ХЗ что там тебе подозрительно.

Цитата Сообщение от hoggy Посмотреть сообщение
Даже если у base* и der* одинаковый размер, читать значение из объекта типа der* через glvalue с типом base* это банально нарушение т.н. strict aliasing rules.
и мне вот очень интересно:
как по твоему должен работать типичный полиморфизм?
C++
1
2
base* ptr = &der;
work(ptr);
а мне вот очень интересно:
где в этом коде чтение значения из объекта типа der* через glvalue с типом base*?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
06.01.2020, 21:17
Цитата Сообщение от rat0r Посмотреть сообщение
где в этом коде чтение
Я, вот так, еще почитываю тему и для большей ясности, я бы, наверное, хотел уточнить, что имеется ввиду под "чтением" (в этом конкретном случае)?
Разыменование указателя?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2020, 21:29
Цитата Сообщение от rat0r Посмотреть сообщение
Нет доступа через glvalue of class type — нет смысла говорить, будет ли behavior (un)defined в случае доступа через glvalue of class type.
не понятно.

приведи пример.

что такое "glvalue of class type"
и почему через него нет доступа к объекту.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 21:29
Цитата Сообщение от Azazel-San Посмотреть сообщение
Я, вот так, еще почитываю тему и для большей ясности, я бы, наверное, хотел уточнить, что имеется ввиду под "чтением" (в этом конкретном случае)?
Это
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2020, 21:30
Цитата Сообщение от rat0r Посмотреть сообщение
где в этом коде чтение значения из объекта типа der* через glvalue с типом base*?
C++
1
2
3
4
void work(base* p)
{
    p->access();
}
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 21:36
Цитата Сообщение от hoggy Посмотреть сообщение
Нет доступа через glvalue of class type…
не понятно.
приведи пример.
Пример чего? Доступа через glvalue of class type? Как я должен привести пример того, чего нет?
Цитата Сообщение от hoggy Посмотреть сообщение
что такое "glvalue of class type"
Ты не знаешь что такое glvalue или что такое class type?
Цитата Сообщение от hoggy Посмотреть сообщение
и почему через него нет доступа к объекту.
Так стандарт C++ написан.

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
где в этом коде чтение значения из объекта типа der* через glvalue с типом base*?
C++
1
2
3
4
void work(base* p)
{
 p->access();
}
Это троллинг тупостью?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2020, 21:41
Цитата Сообщение от rat0r Посмотреть сообщение
Пример чего? Доступа через glvalue of class type? Как я должен привести пример того, чего нет?
ты в состоянии по-русски объяснить что такое glvalue of class type ?
я вот нефига не понял, что имеется ввиду под этим словосочетанием.
или ты только ссылки можешь скидывать?

Цитата Сообщение от rat0r Посмотреть сообщение
Ты не знаешь что такое glvalue или что такое class type?
я понимаю что это по отдельности.
а вот всё вместе: glvalue of class type
как это вообще может выглядеть - не понятно.

Добавлено через 2 минуты
Цитата Сообщение от rat0r Посмотреть сообщение
Это троллинг тупостью?
ладно.
зайдём с другой стороны.


Цитата Сообщение от rat0r Посмотреть сообщение
Даже если у base* и der* одинаковый размер, читать значение из объекта типа der* через glvalue с типом base* это банально нарушение т.н. strict aliasing rules.
показывай.
приведи пример как такое вообще может быть.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 21:59
Цитата Сообщение от hoggy Посмотреть сообщение
я понимаю что это по отдельности.
а вот всё вместе: glvalue of class type
как это вообще может выглядеть - не понятно.
Напиши, как ты понимаешь это по-отдельности и, если ты понимаешь правильно, поймёшь, как это выглядит не по-отдельности.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.01.2020, 22:06
Цитата Сообщение от hoggy Посмотреть сообщение
приведи пример как такое вообще может быть.
C++
1
2
3
4
    int i_val{};
    float f_val{};
    f_val = *reinterpret_cast<float*>(&i_val);// так нельзя(справа то самое чтение glvalue)
    std::memcpy(&f_val, &i_val, sizeof(i_val));// так можно(если размеры объектов равны)
0
06.01.2020, 22:11

Не по теме:

Цитата Сообщение от zayats80888 Посмотреть сообщение
std::memcpy(&f_val, &i_val, sizeof(i_val));// так можно(если размеры объектов равны)
Я бы не стал уверенно утверждать, что "можно". Но это довольно "скользкая" тема.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2020, 22:14
Цитата Сообщение от zayats80888 Посмотреть сообщение
int i_val{};
    float f_val{};
    f_val = *reinterpret_cast<float*>(&i_val);// так нельзя
    std::memcpy(&f_val, &i_val, sizeof(i_val));// так можно(если размеры объектов равны)
понял.

https://rextester.com/FSAJT55695

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main() 
{
   char data[sizeof(int)];
   int* i = new (data) int;
   *i = 33;
 
   std::cout << *reinterpret_cast<int*>(data);
}
Code
1
2
3
4
5
source_file.cpp: In function ‘int main()’:
source_file.cpp:9:45: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
    std::cout << *reinterpret_cast<int*>(data);
                                             ^
33
теперь такой пример:
https://rextester.com/SPY59337

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
struct base
{
    virtual ~base(){}
    virtual void foo(){ std::cout << "base::foo()\n"; }
    int v = 3;
};
 
struct der: base
{
    virtual void foo(){ std::cout << "der::foo()\n"; }
    int w[100];
};
 
 
int main()
{
    der d;
    der* p = &d;
    base* b = reinterpret_cast<base*>(p);
    b->foo();
}
никаких ворнингов.

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

я считаю, что компилятор не агриццо на нарушение алиасинга,
потому что и нет никакого нарушения.

сам же доступ к объекту попадает под правило:

Цитата Сообщение от hoggy Посмотреть сообщение
(8.7) — a type that is a (possibly cv-qualified) base class type of the dynamic type of the object,
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.01.2020, 22:22
Цитата Сообщение от hoggy Посмотреть сообщение
der* p = &d;
base* b = reinterpret_cast<base*>(p);
он про это(наверное)
C++
1
base** b = reinterpret_cast<base**>(&p)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2020, 22:25
Цитата Сообщение от zayats80888 Посмотреть сообщение
он про это
base** b = reinterpret_cast<base**>(&p)
а я думаю он про это:

Цитата Сообщение от rat0r Посмотреть сообщение
Даже если у base* и der* одинаковый размер, читать значение из объекта типа der* через glvalue с типом base* это банально нарушение т.н. strict aliasing rules.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 22:26
Цитата Сообщение от hoggy Посмотреть сообщение
никаких ворнингов.
Ты стандарт по (кривым) ворнингам учишь?
Вот код "с ворнингом" скомпиленный другой (более новой) версией GCC https://wandbox.org/permlink/0aFslORONG3p4MNn
"никаких ворнингов."
Теперь ты перестанешь думать, что там нарушение strict aliasing rule(s)?
Цитата Сообщение от hoggy Посмотреть сообщение
если rat0r, имел ввиду именно такой кейс,
тогда пусть объяснит на каком основании он решил,
что здесь имеет место быть нарушению алиасинга.
Нет, не такой кейс. zayats80888 написал правильно:
C++
1
2
base** b = reinterpret_cast<base**>(&p);
(*b)->foo();
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.01.2020, 22:28
Цитата Сообщение от hoggy Посмотреть сообщение
а я думаю он про это
ну правильно, если в моём примере заменить int и float на base* и der*
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2020, 22:45
zayats80888, да. Речь о преобразовании. Когдв функция принимает указатель на первый элемент (он тоже указатель) она уже не читает указатель на указатель. Она его использует для доступа. Это и есть выражение P/Q и не важно индексно или через адресную арифметику идёт получение ссылки на элемент. А чтение происходит уже самого элемента - то есть указателя Derived* в Base*. Доступ для чтения получается через ссылку полученную из P/Q - указателя на указавтель, да. Но там нет чтения. А указатель Base* гарантирует приём на чтение Derived*. И количество базовых роли не должно играть (одиночное/множественное наследование).
То есть, несмотря на то, что стандарт запрещает P->Q (similarity) но дело вряд ли в нарушеннии strict aliasing. Вопрос кастинга (B**)->(D**) неприятен/скользок. Но непонятен в данном кейсе. Где он может создать проблему?

Добавлено через 5 минут
То есть, если до конца идти - то вопрос почему нет неявного преобразования. Я помню у Страуструпа хороший кусок посвящён тому что он показывет что зависимые типы вроде list<Base*> и list<Derived*> не преобразуются (это не указатель в указатель). В чём то кейс похож, в чём-то нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.01.2020, 22:45
Помогаю со студенческими работами здесь

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

Восходящее и нисходящее преобразование (Upcasting and Downcasting)
Посоветуйте литературу по данному вопросу в разрезе С++ ну или простыми словами что это, для чего нужно заранее спасибо

Неявное восходящее преобразование при защищенном/закрытом наследовании
Здравствуйте. Читаю книгу Стивена Прата по C++. Попался непонятный момент: в одной таблице (в таблице 14.1 в 6-й рус. редакции на стр....

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект базового класса, а ves- производного ...

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru