if(dp) cout << "Приведение типа прошло успешно!";
Здесь приведение указателя
bp = &b_ob; /* Указатель на базовый класс ссылается на объект класса Base. */
dp = dynamic_cast
if(!dp) cout << "Приведение типа выполнить не удалось";
Поскольку попытка выполнить операцию приведения типа оказалась неудачной, при выполнении этого фрагмента кода будет выведено сообщение
В следующей программе демонстрируются различные ситуации применения оператора
// Использование оператора dynamic_cast.
#include
using namespace std;
class Base {
public:
virtual void f() { cout << "В классе Base.\n"; }
// . . .
};
class Derived : public Base {
public:
void f() { cout << "В классе Derived.\n"; }
};
int main()
{
Base *bp, b_ob;
Derived *dp, d_ob;
dp = dynamic_cast
if(dp) {
cout << "Приведение типов " <<"(из Derived * в Derived *) реализовано.\n";
dp->f();
}
else cout <<"Ошибка\n";
cout << endl;
bp = dynamic_cast
if(bp) {
cout << "Приведение типов " <<"(из Derived * в Base *) реализовано.\n";
bp->f();
}
else cout << "Ошибка\n";
cout << endl;
bp = dynamic_cast
if(bp) {
cout << "Приведение типов " <<"(из Base * в Base *) реализовано.\n";
bp->f();
}
else cout << "Ошибка\n";
cout << endl;
dp = dynamic_cast
if(dp) cout <<"Ошибка\n";
else
cout <<"Приведение типов " <<"(из Base * в Derived *) не реализовано.\n";
cout << endl;
bp = &d_ob; // bp указывает на объект класса Derived
dp = dynamic_cast
if(dp) {
cout << "Приведение bp к типу Derived *\n" << "реализовано, поскольку bp действительно\n" << "указывает на объект класса Derived.\n";
dp->f();
}
else cout << "Ошибка\n";
cout << endl;
bp = &b_ob; // bр указывает на объект класса Base
dp = dynamic_cast
if(dp) cout << "Ошибка";
else {
cout <<"Теперь приведение bp к типу Derived *\n" <<"не реализовано, поскольку bp\n" <<"в действительности указывает на объект\n" <<"класса Base.\n";
}
cout << endl;
dp = &d_ob; // dp указывает на объект класса Derived
bp = dynamic_cast
if(bp) {
cout <<"Приведение dp к типу Base * реализовано.\n";
bp->f();
}
else cout <<"Ошибка\n";
return 0;
}
Программа генерирует такие результаты.
Приведение типов (из Derived* в Derived*) реализовано.
В классе Derived.
Приведение типов (из Derived* в Base*) реализовано.
В классе Derived.
Приведение типов (из Base* в Base*) реализовано.
В классе Base.