Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Непонятки с приведением типов.


Автор: m9yt 18.6.2010, 15:53
Привет всем.
Есть следующий код:
Код

#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 не работает.
Помогите разобраться!

Автор: ИванМ 18.6.2010, 16:00
m9yt, dymamic_cast может преобразовать только те объекты, которые принадлежат классу переданного в качестве параметра объекта или являются базовыми классами этого объекта. В обратную сторону не работает.

Автор: m9yt 18.6.2010, 16:07
Тогда в чём смысл этого кода?

Код

p2=(meaning*)(&wrd);

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

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

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

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

ну ведь после этого "p2=(meaning*)(&wrd);" он указывает на объект класса-предок
А такое возможно?

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

Он указывает на тот же самый объект, только после этого преобразование компилятор будет считать, что он указывает на предка, но поскольку на самом деле этот объект предком не является, то работать программа будет неправильно. В вашем случае при вызове метода get из указателя p2 вызывается не метод get() класса meaning, а класса word, из-за того, что виртуальная функция.

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

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

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





Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)