Лучший способ сделать это - использовать множественное наследование, то есть интерфейсы.
class HasExample // note no superclass here!
{
virtual void example() = 0;
};
class Derived : public Base, public HasExample
{
void example()
{
printf("example!\n");
}
}
vector<Base*> objects;
objects.push_back(new Derived());
Base* p = objects[0];
HasExample* he = dynamic_cast<HasExample*>(p);
if (he)
he->example();
dynamic_class <> () во время выполнения проверяет, реализует ли данный объект HasExample, и возвращает либо HasExample* или NULL.Однако, если вы обнаружите, что используете HasExample *, это, как правило, знак того, что вам нужно переосмыслить свой дизайн.
Осторожно!При таком множественном наследовании (HasExample *) ptr! = Ptr.Приведение указателя к одному из его родителей может привести к изменению значения указателя.Это совершенно нормально, и внутри метода это будет то, что вы ожидаете, но это может вызвать проблемы, если вы не знаете об этом.
Редактировать: Добавлен пример dynamic_cast <>(), потому что синтаксис странный.