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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачем это нужно? 
V
    Опции темы
yngwie19
Дата 8.11.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



Привет всем. Подскажите пожалуйста зачем использовать приведение пипа указателя базового класса к типу указателя производного класса, и наоборот. Если можно с примерами. Спасибо
PM MAIL   Вверх
mes
Дата 8.11.2008, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(yngwie19 @  8.11.2008,  19:08 Найти цитируемый пост)
Подскажите пожалуйста зачем использовать приведение пипа указателя базового класса к типу указателя производного класса, и наоборот. 

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

вот пример по использованию приведения к указателю на базовый:
Код

class Auto
{
public:
  virtual ~Auto() {}
   virtual void Draw () =0;
};

class Audi : public Auto
{
   public:
   virtual void Draw () { std::cout <<"draw audi" <<std::endl ; }
};

class Bmw : public Auto
{
   public:
   virtual void Draw () { std::cout <<"draw bmw" <<std::endl ; }
};

class VW : public Auto
{
   public:
   virtual void Draw () { std::cout <<"draw  vw" <<std::endl ; }
};

void Draw(Auto* a)
{
   a->Draw();
}

int main ()
{
std::vector<Auto*> Autopark;
Autopark.push_back(new Bmw);
Autopark.push_back(new Audi);
Autopark.push_back(new Bmw);
Autopark.push_back(new VW);
Autopark.push_back(new Audi);

std::for_each(Autopark.begin(), Autopark.end(), &Draw);
return 0;
}



а для обратного приведения примера демонстрирующего хорошее решение задачи я не знаю
но вот как выглядил бы предыдущи пример :
Код


class Auto
{
public:
  virtual ~Auto() {}
};

class Audi : public Auto 
{
    public:
        void Draw () // не virtual  
                           { std::cout <<"draw audi" <<std::endl ; } 
};
class Bmw : public Auto 
{
    public:
        void Draw () // не virtual   
                           { std::cout <<"draw bmw" <<std::endl ; }
};
class VW : public Auto 
{
    public:
        void Draw ()  // не virtual  
                            { std::cout <<"draw vw" <<std::endl ; }
};

void Draw (Auto * a)
{
        if (Bmw*  bmw   = dynamic_cast<Bmw*>(a))   bmw->Draw();
   else if (Audi* audi  = dynamic_cast<Audi*>(a))  audi->Draw();   
   else if (VW*   vw    = dynamic_cast<VW*>(a))    vw->Draw();  
// кстати в такой проверке всегда надо соблюдать порядок преобразования, если иерархия длинее одного наследования
// а то же самое в верхнем пример решается под контролем компилятора,
// и поэтому (но не только) предпочтительнее вместо  dynamic_cast воспользоваться  механизмом виртуальных функций
};

int main ()
{
std::vector<Auto*> Autopark;
Autopark.push_back(new Bmw);
Autopark.push_back(new Audi);
Autopark.push_back(new Bmw);
Autopark.push_back(new VW);
Autopark.push_back(new Audi);

std::for_each(Autopark.begin(), Autopark.end(), &Draw);
return 0;
}
 


Это сообщение отредактировал(а) mes - 8.11.2008, 22:54


--------------------
PM MAIL WWW   Вверх
programming
  Дата 8.11.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(mes @ 8.11.2008,  17:40)
а может лучше в книжке ?

Действительно в книгах много про это информации.
И на этом форуме я видел подобные темы.
--------------------
<удалено администрацией>
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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