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