Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Brother
Сообщений: n/a
#1

dynamic_cast<X&>(Y) что в результате? - C++

22.10.2007, 10:12. Просмотров 1551. Ответов 10
Метки нет (Все метки)

Попытка привести указатель на один класс к указателю на другой (несовместимый) в результате получим NULL
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class X{
};
class Y{
};
 
X *px = new X();
Y *py = dynamic_cast<Y*>(X);
//py == NULL т.к. px неприводим к py
 
Что будет результатом, если
 
class X{
};
class Y{
};
 
X x;
X& ref_X = x;
Y& ref_Y = dynamic_cast<Y&>(ref_X);
//чему равно ref_Y ?
Кто что скажет ? ...Желательно со ссылкой на источник, типа ANSI C++ стандарт и пр...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2007, 10:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос dynamic_cast<X&>(Y) что в результате? (C++):

typeid && dynamic_cast - C++
Здравствуйте! а можно ли вот так написать? bool Item::operator==(Ware * w) const { if (typeid(*w) == typeid(*this)) ...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? - C++
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

Вызов виртуальной функции vs несколько dynamic_cast подряд: что быстрее? - C++
Нужно максимально оптимизировать программу вот и пал выбор: лучше сделать чтобы вызывались виртуальные функции или же чтобы было четыре...

Что это такое **&amp;? - C++
Здравствуйте! как загуглить,

Что будет вызвано в результате вызова f()? - C++
Дан код со следующим определением класса A: struct A { void f() {/* метод 1*/} void f(int x) {/* метод 2*/} void...

Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;) - C++
Хочу специализировать swap для своего класса. Получаю ошибку. Вот код:#ifndef A_H #define A_H #include &lt;string&gt; class A { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
22.10.2007, 11:44 #2
C++
1
2
X *px = new X();
Y *py = dynamic_cast<Y*>(X);
Это опечатка?

Ты хотел показать:
C++
1
Y *py = dynamic_cast<Y*>(px);
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
22.10.2007, 11:49 #3
Вот немного из теории, там все на пальцах описано
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang98/HTML/_pluslang_dynamic_cast_operator.asp

Удачи, Владимир.
P.S. Делай все свои объекты наследниками CObject или CMyObject и тогда всегда будет к чему приводиить
P.P.S. Зачем тебе приводить друг к дружке совершенно не совместимые классы? Если твоя программа продумана, такого случаться не должно!
Brother
Сообщений: n/a
22.10.2007, 12:09 #4
Во-первых, я действительно опечатался
Что до ссылки - читал я это уже в MSDN... Про приведение ссылок там - ни слова... А помню стандарт читал - там и ссылки приводить можно было... Но ограничения при этом какие - не помню...
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
22.10.2007, 18:36 #5
Здесь один из черновиков ANSI C++ стандарта, говорящий о dynamic_cast:
http://www.cygnus.com/misc/wp/dec96pub/expr.html#expr.dynamic.cast

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

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

Кстати, ты так и не ответил зачем тебе приводить не приводимые типы?

С уважением, Владимир

P.S. За настоящий стандарт (последняя версия 1998 г) тебе придется выложить порядка 250$. И почему я так уверен, что по поводу dynamic_cast там сказано не больше?
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
22.10.2007, 18:47 #6
Кстати, вопрос:

> X& ref_X = x;
> Y& ref_Y = dynamic_cast<Y&>(ref_X);
> //чему равно ref_Y ?

, как мне кажеться, из класса:

у меня есть функция
CAddress & FindAddress(CString & name);
что мне возвращать в результате, если функция не нашла соответствующего адреса?
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
22.10.2007, 18:55 #7
8 The run-time check logically executes as follows:

--If, in the most derived object pointed (referred) to by v, v points
(refers) to a public base class sub-object of a T object, and if
only one object of type T is derived from the sub-object pointed
(referred) to by v, the result is a pointer (an lvalue referring) to
that T object.

--Otherwise, if v points (refers) to a public base class sub-object of
the most derived object, and the type of the most derived object has
an unambiguous public base class of type T, the result is a pointer
(an lvalue referring) to the T sub-object of the most derived
object.

--Otherwise, the run-time check fails.

Судя по всему должен в любом случае получить ошибку, даже с указателями, а не указатель на NULL
Если следовать стандарту - Run-time Error
Brother
Сообщений: n/a
23.10.2007, 10:17 #8
Yes! Нашел! В MSDN !
Вот чего пишуть :
The value of a failed cast to pointer type is the null pointer. A failed cast to reference type throws a bad_cast exception.
Это в самом конце страницы про dynamic_cast...
Действительно, зачем случае c приведением к указателю выкидывать исключение, если и так можно вернуть 0, означающий ошибку? А со ссылками сложнее - нельзя делать ссылку на объект типа void... Тут без bad_cast никак не обойтись...
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
23.10.2007, 12:21 #9
Поздравляю!
Хотя странно, либо стандарт был немного изменен, потому что та ссылка, что я давал - это 'ченовик стандарта', либо Microsoft не следует стандарту, так как в любом случае должна срабатывать исключительная ситуация.

С уважением, Владимир
Brother
Сообщений: n/a
23.10.2007, 15:00 #10

Внимательно почитал прект стандарта... Вот что вычитал...
Про dynamic_cast в пункте 9 говорится
'9 The value of a failed cast to pointer type is the null pointer value
of the required result type. A failed cast to reference type throws
bad_cast (_lib.bad.cast_).'

boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
23.10.2007, 15:23 #11
Я до этого пункта не дошел
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2007, 15:23
Привет! Вот еще темы с ответами:

Что значат && и || - C++
Вроде бы результат кода один и тот же первый код #include &lt;stdio.h&gt; #define MAX_STRING_SIZE 20 int main() { FILE *pFile;...

Что будет в переменных в результате выполнения кода? - C++
программный код: int z=6, x=-2, y=4; z+=y=5+x--; Что будет в переменных в результате выполнения?

Что выведется на экран в результате выполнения фрагмента кода? - C++
Помогите пожалуйста, сделать 5 небольших задач , спасибо всем кто откликнется! 1.Что выведется на экран в результате выполнения...

Определить, что будет выдано на терминал в результате выполнения программы - C++
Помогите ответить на вопрос Определить, что будет выдано на терминал в результате выполнения программы: #include&lt;iostream.h&gt;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.10.2007, 15:23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru