Как правило, вам не нужно знать:
struct A {
virtual int generate_foo() = 0;
};
struct B : A {
int generate_foo() { return 42; }
};
struct C : A {
i_;
C(int i) : i_(i) { }
int generate_foo() { return i_++; }
};
Если у вас есть A*
, вы (1) знаете, что у него есть метод generate_foo()
, и (2) знаете, что generate_foo()
сгенерирует подходящее foo для любого объекта, который у вас действительно есть.В общем, этого должно быть достаточно, и вы должны иметь возможность отслеживать, когда у вас есть A*
.
С философской точки зрения дизайнеры C ++ потратили годы, пытаясь избежать добавления информации о типе среды выполненияпотому что это слишком легко используется неправильно.Тем не менее, они в конечном итоге решили, что находятся не на том конце проигравшей битвы, и добавили dynamic_cast
и typeinfo()
.C ++ 0x добавит больше.