355
правок
Изменения
→const_cast, reinterpret_cast
Если приведение не удалось, возникнет ошибка на этапе компиляции. Однако, если это приведение между указателями на объекты классов вниз по иерархии и оно не удалось, результат операции undefined. То есть, возможно такое приведение: static_cast<Derived*>(pBase), даже если pBase не указывает на Derived, но программа при этом будет вести себя странно.
=== const_cast===Самое простое приведение типов. Убирает так называемые cv спецификаторы (cv qualifiers), то есть const и volatile. volatile встречается не очень часто, так что более известно как приведение типов, предназначенное для убирания const. Если приведение типов не удалось, выдается ошибка на этапе компиляции.При использовании остальных приведений типов cv спецификаторы останутся как были. int i; const int * pi = &i; // *pi имеет тип const int, // но pi указывает на int, который константным не является int* j = const_cast<int *> (pi); === reinterpret_cast ===Самое нахальное приведение типов. Не портируемо, результат может быть некорректным, никаких проверок не делается. Считается, что вы лучше компилятора знаете как на самом деле обстоят дела, а он тихо подчиняется. Не может быть приведено одно значение к другому значению. Обычно используется, чтобы привести указатель к указателю, указатель к целому, целое к указателю. Умеет также работать со ссылками. reinterpret_cast<whatever *>(some *) reinterpret_cast<integer_expression>(some *) reinterpret_cast<whatever *>(integer_expression) Чтобы использовать reinterpret_cast нужны очень и очень веские причины. Используется, например, при приведении указателей на функции.
=== зачем нужно виртуальное наследование (несколько баз с разными адресами у одного класса, typecast'ы, исключения) ===
=== виртуальное наследование ===