Часть IV. Новые возможности C++
cout « (pBaseTest ? "является" : "не является") cout « " типом Base*.\n";
Этот код компилируется и выполняется, как и можно было ожидать. Как выясняется, компилятор Borland C++ позволяют динамически приводить к типу верхнего класса в иерархии (например от производного класса к базовому) даже в случае не полиморфных классов. В листинге 23.5 приводятся изменения, вносящие ошибку в программу.
ftinclude <iostream.h>
// Не полиморфный класс class Base {
// Ничего не делает };
// Не полиморфный класс class Derived : public Base {
// Ничего не делает };
void main() 1
Derived MyDerived;
Derived* pMyDerived = SMyDerived;
// Успешное приведение вверх Base* pBaseTest = dynamic_cast<Base*>(pMyDerived) ;
. cout « "pMyDerived ";
cout « (pBaseTest ? "является" : "не является");
cout « " типом Base*.\n";
// Успешное!??) приведение вниз if (pBaseTest) {
Derived* pDerivedTest =
dynamic cast<Derived*>(pBaseTest) ;
cout « "pBaseTest ";
cout « (pDerivedTest ? "является" : "не является" cout « " типом Derived*.\n";
Эта программа даже не будет компилироваться из-за того, что вторая по счету операция dynamic_cast пытается привести базовый указатель к производному, хотя ни один из классов не является полиморфным. Компилятор сообщит, что тип Base не является классом с виртуальными функциями
(.Type 'Base' is not a defined class with virtual functions).