Предупреждение: обратите внимание, что это глупый вопрос, который я, вероятно, никогда не решу таким образом. Отсюда и противоречивое название. Но так как я действительно видел что-то подобное в коде, через который я прошел на очень большой системе, я был заинтригован. :)
Допустим, у нас есть упрощенный класс:
class Foo
{
void a();
virtual void b();
}
а потом еще класс
class Bar : public Foo
{
void a();
}
Если общая часть программы обрабатывает все эти классы как базовый класс типа Foo
, как мне наилучшим образом вызвать «правильную» версию функции a
внутри b
? Так как есть вероятность, что объект имеет тип Bar
. И скажем, вы, по устаревшим причинам, не можете изменить существующий код и сделать базовый класс функцией virtual и т. д.
Что я сделал, так это сделал a
виртуальным в базовом классе и реализовал b
в Bar
, поскольку у меня была такая возможность. Но скажем ради аргумента, что это было невозможно или недопустимо. Насколько «неправильным» было бы реализовать обходной путь, используя что-то вроде этого.
void b() {
...
Bar* dabar;
if((dabar = dynamic_cast<Bar*>(this)) != NULL) {
dabar->a();
}
else {
a();
}
}
Как я уже сказал, обратите внимание, что это происходит при работе с базовыми классами и при желании вызвать функцию дочернего класса. А не наоборот.