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

cout « (pBaseTest ? "является" : "не является") cout « " типом Base*.\n";

Этот код компилируется и выполняется, как и можно было ожидать. Как выясняется, компилятор Borland C++ позволяют динамически приводить к типу верхнего класса в иерархии (например от производного класса к базовому) даже в случае не полиморфных классов. В листинге 23.5 приводятся изменения, вносящие ошибку в программу.

h06541.jpg

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).