(На этот вопрос, вероятно, следует ответить со ссылкой на Страуструпа.)
Кажется чрезвычайно полезным иметь возможность запрашивать указатель на наиболее производный класс, как показано ниже:
class Base { ... };
class DerivedA { ... };
class DerivedB { ... };
class Processor
{
public:
void Do(Base* b) {...}
void Do(DerivedA* d) {...}
void Do(DerivedB* d) {...}
};
list<Base*> things;
Processor p;
for(list<Base*>::iterator i=things.begin(), e=things.end(); i!=e; ++i)
{
p.Do(CAST_TO_MOST_DERIVED_CLASS(*i));
}
Но этот механизм не предусмотрен в c ++.Почему?
Обновление, Пример мотивации:
Предположим, что вместо Base, Derived и Processor у вас есть:
class Fruit
class Apple : public Fruit
class Orange: public Fruit
class Eater
{
void Eat(Fruit* f) { ... }
void Eat(Apple* f) { Wash(f); ... }
void Eat(Orange* f) { Peel(f); ... }
};
Eater me;
for each Fruit* f in Fruits
me.Eat(f);
Но этосложно сделать в C ++, требуя творческих решений, таких как шаблон посетителя.Таким образом, возникает вопрос: почему это сложно сделать в C ++, когда что-то вроде «CAST_TO_MOST_DERIVED» сделает это намного проще?* Я думаю, что Pontus Gagge имеет хороший ответ.Добавьте к этому этот бит из записи Википедии о Multiple Dispatch :
"Страуструп упоминает, что ему понравилась концепция Multi-методов в Проектирование и развитие C ++ и рассмотрел возможность его реализации в C ++, но утверждает, что не смог найти эффективную примерную реализацию (сравнимую с виртуальными функциями) и разрешить некоторые возможные проблемы неоднозначности типов. Он продолжает утверждать, что хотя эту функцию все равно было бы неплохо иметьто, что он может быть приблизительно реализован с использованием двойной диспетчеризации или таблицы поиска на основе типов, как описано выше в примере C / C ++, так что это функция с низким приоритетом для будущих ревизий языка. "
Для фона выможно прочитать небольшую сводку о Multi-Methods , которая будет лучше, чем вызов, подобный тому, который я упомянул, потому что они просто сработают.