Страница 1 из 1

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

Добавлено: 26.10.2011 12:36
Гость

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

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. Чо делать?

Спасибо заранее за ценные мысли и советы :)

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

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

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

Добавлено: 28.10.2011 20:17
Vova
Что именно не работает?

Замечу, что

dynamic_cast<B *>(this) == this

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

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

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