Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятки с приведением типов. 
:(
    Опции темы
m9yt
Дата 18.6.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Привет всем.
Есть следующий код:
Код

#include<iostream>
#include<typeinfo>
#include<cstring>
using namespace std;

class word{
    char ss[80];
public:
    word(){strcpy(ss, "");}
    word(char *s){strcpy(ss, s);}
    virtual char *get(){return ss;}
};

class meaning:public word{
    char ss[80];
public:
    meaning(){strcpy(ss, ""); }
    meaning(char *s){strcpy(ss, s); }
    char *get(){return ss; }
};

void main()
{
    word wrd("Privet"), *p1;
    meaning mng, *p2;
    p2=(meaning*)(&wrd);                            //Пример1
    if (p2) cout<<p2->get();
    p2=dynamic_cast<meaning*>(&wrd);    //Пример2
    if (p2) cout<<p2->get();
}


Почему-то пример1 работает, т.е. функция get возвращает указатель, а 2 пример, по-моему, релизует то же самое, но с указателем p2 проблема-функция get не работает.
Помогите разобраться!

Это сообщение отредактировал(а) m9yt - 18.6.2010, 15:54
PM MAIL   Вверх
ИванМ
Дата 18.6.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



m9yt, dymamic_cast может преобразовать только те объекты, которые принадлежат классу переданного в качестве параметра объекта или являются базовыми классами этого объекта. В обратную сторону не работает.
PM MAIL   Вверх
m9yt
Дата 18.6.2010, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Тогда в чём смысл этого кода?

Код

p2=(meaning*)(&wrd);

PM MAIL   Вверх
ИванМ
Дата 18.6.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Цитата(m9yt @  18.6.2010,  16:07 Найти цитируемый пост)
Тогда в чём смысл этого кода?
p2=(meaning*)(&wrd);

Это небезопасное приведение типа. Можно что угодно привести к чему угодно.

Это сообщение отредактировал(а) ИванМ - 18.6.2010, 16:09
PM MAIL   Вверх
m9yt
Дата 18.6.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Цитата(ИванМ @ 18.6.2010,  16:09)
Цитата(m9yt @  18.6.2010,  16:07 Найти цитируемый пост)
Тогда в чём смысл этого кода?
p2=(meaning*)(&wrd);

Это небезопасное приведение типа. Можно что угодно привести к чему угодно.

ну ведь после этого "p2=(meaning*)(&wrd);" он указывает на объект класса-предок
А такое возможно?
PM MAIL   Вверх
ИванМ
Дата 18.6.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Цитата(m9yt @  18.6.2010,  16:18 Найти цитируемый пост)
ну ведь после этого "p2=(meaning*)(&wrd);" он указывает на объект класса-предок

Он указывает на тот же самый объект, только после этого преобразование компилятор будет считать, что он указывает на предка, но поскольку на самом деле этот объект предком не является, то работать программа будет неправильно. В вашем случае при вызове метода get из указателя p2 вызывается не метод get() класса meaning, а класса word, из-за того, что виртуальная функция.
PM MAIL   Вверх
bsa
Дата 19.6.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



dynimic_cast нужен для преобразования указателя/ссылки на предка в указатель/ссылку на потомка в том случае, когда не известно точно, на какого именно потомка указывает указатель/ссылка. Работает ТОЛЬКО для классов с виртуальными методами.
static_cast может использоваться тогда, когда достоверно известно, что указатель/ссылка указывает именно на нужного потомка.

PM   Вверх
mes
Дата 19.6.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(bsa @  19.6.2010,  10:12 Найти цитируемый пост)
.. предка в .. потомка 

(не для новичков) добавлю для полноты : также для cross_cast`инга при множественном наследовании..






Это сообщение отредактировал(а) mes - 19.6.2010, 13:03


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0951 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.