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

Moderator: Little Muk

Post Reply
Guest

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

Post by Guest »

Code: Select all

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

Спасибо заранее за ценные мысли и советы :)
User avatar
Вий
Posts: 6070
Joined: 22 Sep 2011, 13:00
ник с it-ru.de: верифицирован
Location: Минск
Contact:

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

Post by Вий »

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

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

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

Post by Vova »

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

Замечу, что

dynamic_cast<B *>(this) == this

будет true всегда, не важно какой конкретный класс, если только не имеет место быть множественное наследование.
vovan
Posts: 1513
Joined: 22 Sep 2011, 13:21

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

Post by vovan »

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