B* b = new D();
D* d = dynamic_cast<D*>(b);
, , vtable b vtable D .
, b , nullptr.
, , : -
class car
{
public:
virtual void drive()
{
std::cout <<"car"<<std::endl;
}
};
class toyota: public car
{
public:
virtual void drive()
{
std::cout <<"toyota"<<std::endl;
}
};
class honda: public car
{
public:
virtual void drive()
{
std::cout <<"honda"<<std::endl;
}
};
template <typename Tderived>
Tderived* dynamicCast(void* pBase)
{
if (*(int**)pBase == *(int**)&Tderived())
{
return (Tderived*)pBase;
}
else
{
return nullptr;
}
}
int main()
{
car* pCar;
honda hondaCar;
toyota toyotaCar;
pCar = &toyotaCar;
honda* pHonda = dynamicCast<honda>(pCar);
if (nullptr != pHonda)
{
pHonda->drive();
}
else
{
toyota* pToyota = dynamicCast<toyota>(pCar);
if (nullptr != pToyota)
{
pToyota->drive();
}
}
}
, , , pCar honda toyota. , dynamic_cast, ++ vtables.