IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Автоматическое приведение типа указателя, С++
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской

Репутация: -  1  +


Доброго всем времени суток.

Имеется такой код:

class CBase
{
public:
virtual void MyVoid()=0;
};

class CDerv1 : public CBase
{
...
};

class CDerv2 : public CBase
{
...
};

...


т.е. есть некий базовый абстрактный класс, у которого много наследников.

Далее происходит вот что:
CBase *pBase = new CDerv1;


Вопрос : очевидно, например с помощью typeid мы можем узнать тип объекта, на который на самом деле указывает pBase. Существует ли простой способ автоматически преобразовать pBase из типа CBase* в тип того объекта, на который он на самом деле указывает (в данном случае в CDerv1*)?


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Почему не написать полиморфную функцию:

void f(CBase *p)
{
p->myF(); // Виртуальная функция myF, и пусть класс сам разбирается, что ему надо делать
}


? Зачем ты уходишь от механизма виртуальных функций, и хочешь делать это же вручную? Можно, кстати,
Цитата
if ( typeid(*pBase).name() == "CDerv1" ) F( (CDerv1*)pBase );
if ( typeid(*pBase).name() == "CDerv2" ) F( (CDerv2*)pBase );

заменить на
    if(dynamic_cast<CDerv1*>(pBase)) f(dynamic_cast<CDerv1*>(pBase));
if(dynamic_cast<CDerv2*>(pBase)) f(dynamic_cast<CDerv2*>(pBase));

, но хрен редьки не слаще...

Хм... Ан нет, слаще. Под GCC твой вариант не работает (там строка в другом формате возвращается), а мой - работает. Или вот этот:
    if ( typeid(*pBase) == typeid(CDerv1)) f( (CDerv1*)pBase );
if ( typeid(*pBase) == typeid(CDerv2)) f( (CDerv2*)pBase );

, тоже работает.

Но основной вопрос был озвучен выше, почему не виртуальные функции?
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.05.2024 1:45
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name