Проблема с dynamic_cast (C++)

Ответить
Аватара пользователя
Гость

Проблема с dynamic_cast (C++)

Сообщение Гость »

Код: Выделить всё

class A {
public:
    virtual bool isB() { return false; }
    ...
};
class B : private /* sic! */ A {
public:
    virtual bool isB() { return true; }
    ...
};
void A::somefunction()
{
    if( isB() ) {
        // debug check to prevent other derived classes of A from getting smart!
        ASSERT( dynamic_cast<B *>(this) == this );
        B *b = static_cast<B *>(this);
        b->doSomething();
    }
}
Не работает. По стандарту dynamic_cast работает только с public inheritance. Чо делать?

Спасибо заранее за ценные мысли и советы :)
Аватара пользователя
Вий
Сообщения: 6237
Зарегистрирован: 22.09.2011 13:00
Ник с it-ru.de: верифицирован
Где: Минск
Род занятий: Программист ;)
Интересы: разные...

Re: Проблема с dynamic_cast (C++)

Сообщение Вий »

Объявить somefunction() виртуальной и перегрузить её в классе B...
Вий есть колоссальное создание простонародного воображения...

"...Когда хотят сделать людей добрыми, мудрыми, свободными, воздержанными, великодушными, то неизбежно приходят к желанию их всех перебить." Анатоль Франс
Аватара пользователя
Vova

Re: Проблема с dynamic_cast (C++)

Сообщение Vova »

Что именно не работает?

Замечу, что

dynamic_cast<B *>(this) == this

будет true всегда, не важно какой конкретный класс, если только не имеет место быть множественное наследование.
vovan
Сообщения: 1521
Зарегистрирован: 22.09.2011 13:21
Род занятий: C++

Re: Проблема с dynamic_cast (C++)

Сообщение vovan »

Гость писал(а):Не работает. По стандарту dynamic_cast работает только с public inheritance. Чо делать?
Надо начать с дизайна. Класс A ничего не должен знать о своих наследниках.
В данном случае я бы советовал использовать решение Вия только метод объявить как protected
Ответить