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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подскажите что плохого в этом проектировании 
:(
    Опции темы
Lazin
Дата 9.11.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Fazil6 @  9.11.2007,  12:24 Найти цитируемый пост)
можно, тока работать будет неправильно smile 

я знаю, просто в этой теме шла речь об эмуляции rtti средствами языка.
PM MAIL Skype GTalk   Вверх
UnrealMan
Дата 9.11.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lazin @  9.11.2007,  12:00 Найти цитируемый пост)
Без dynamic_cast нельзя привести указатель от базового класса к потомку при виртуальном наследовании

Но это ещё не всё. С помощью typeid можно сравнивать типы только most derived-объектов, а dynamic_cast успешно отработает и для промежуточных базовых классов:

Код

#include <iostream>
#include <typeinfo>

struct Base { virtual ~Base() {} };
struct Derived : Base {};
struct MostDerived : Derived {};

int main()
{
    MostDerived mostDerived;
    Base &base = mostDerived;
    if (dynamic_cast<Derived *>(&base))
        std::cout << "object is convertible to Derived" << std::endl;
    if (dynamic_cast<MostDerived *>(&base))
        std::cout << "object is convertible to MostDerived" << std::endl;
    if (typeid(base) == typeid(Derived))
        std::cout << "object is of type Derived" << std::endl;
    if (typeid(base) == typeid(MostDerived))
        std::cout << "object is of type MostDerived" << std::endl;
}

Ещё dynamic_cast способен одним махом произвести такое преобразование:

Код

struct Base { virtual ~Base() {} };
struct Derived1 : Base {};
struct Derived2 : Base {};
struct MostDerived : Derived1, Derived2 {};

int main()
{
    MostDerived mostDerived;
    Derived1 &derived1 = mostDerived;
    Derived2 &derived2 = dynamic_cast<Derived2 &>(derived1);
}

а static_cast пришлось бы применить два раза.
PM MAIL   Вверх
Vyacheslav
Дата 9.11.2007, 15:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(archimed7592 @  9.11.2007,  11:47 Найти цитируемый пост)
Для преобразований к базовому касты не нужны вовсе... 

Вы меня положительно за идиота держите smile
Посмотрите еще раз постановку.
Есть коллекция объектов производных классов, которые выступают как указатели на базовый класс A.  Нужно выполнить определенные операции над объектами только тех классов, которые являются  производными  класса D, то есть над объектами E; J; H; K.

При использовании  dynamic_cast  это решается одной строчкой
Код

 if (D d* = dynamic_cast<D*>(a))
{
    //....
}

При использовании typeid тупо просматривается примерно следущее
Код

 if ( typid(D) == typeid(*a) || typid(E) == typeid(*a) || typid(H) == typeid(*a) || typid(K) == typeid(*a)
{
    D d* = static_cast<D*>(a);
}

Может конечно можно еще как то задействовать type_info::before( const type_info &rhs ) const ,  но проще всетаки dynamic_cast.
И кстати, а разве  typeid для использования динамического типа не использует тот же  RTTI? 




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Alek86
Дата 10.11.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



оффтоп
хоть кто-то "на моей стороне" smile


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

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

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

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

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


 




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


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

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