666 __ ________________Часть IV. Новые возможности C++

//Вывод взаимоотношения

void ShowBefore(const typeinfos infol, const typeinfos info2)

{

cout « infol.name();

cout « (infol.before(info2) ? " является " : " не является ");

cout « "предком " « info2.nameO « "\n";

}

void main() {

// Вывод взаимоотношений

ShowBefore(typeid(Base), typeid(Middle));

ShowBefore(typeid(Base), typeid(Derived)) ;

ShowBefore(typeid(Middle), typeid(Base));

ShowBefore(typeid(Middle), typeid(Derived)) ;

ShowBefore(typeid(Derived), typeid(Base)); •

ShowBefore(typeid(Derived), typeid(Middle));.

Наиболее полезное применение метода before () состоит в том, что он дает возможность легко выяснить, какой из классов является производным от другого (например, Base является предком класса Derived, то есть в иерархии находится перед (before) ним). Результат работы программы из листинга 23.12 должен был бы выглядеть следующим образом:

Base является предком Middle Base является предком Derived Middle не является предком Base Middle является предком Derived Derived не является предком Base Derived не является предком Middle

Однако на самом деле результат, который получается при использовании компилятора Borland C++, не совсем таков. На первый взгляд в нем трудно найти какую-либо закономерность:

Base является предком Middle Base является предком Derived Middle не является предком Base Middle не является предком Derived Derived не является предком Base Derived является предком Middle

По мнению компилятора, порядок в этой иерархии классов выглядит таким образом: Base, Derived, а затем Middle. Этот порядок, очевидно, не соответствует действительным отношениям наследования. В чем же причина?

Если имена классов Base, Middle и Derived заменить на А, в и с, компилятор выдаст следующий результат: