#include <iostream>
struct B
{
virtual ~B() {} // виртуальный деструктор нужен для правильного удаления
};
struct D : B
{
void f() { std::cout << "D::f()\n"; }
};
int main() {
B* b = new D;
// b->f(); // Ошибка компиляции
D* d = dynamic_cast<D*>(b); // Выясняем является ли переменная b типом D
if( d )
{
d->f(); // Вызываем только если действительно является
}
delete b;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEIKewoJdmlydHVhbCB+QigpIHt9IC8vINCy0LjRgNGC0YPQsNC70YzQvdGL0Lkg0LTQtdGB0YLRgNGD0LrRgtC+0YAg0L3Rg9C20LXQvSDQtNC70Y8g0L/RgNCw0LLQuNC70YzQvdC+0LPQviDRg9C00LDQu9C10L3QuNGPCn07CgpzdHJ1Y3QgRCA6IEIKewoJdm9pZCBmKCkgeyBzdGQ6OmNvdXQgPDwgIkQ6OmYoKVxuIjsgfSAKfTsKCgppbnQgbWFpbigpIHsKCQoJQiogYiA9IG5ldyBEOwoJCgkvLyBiLT5mKCk7IC8vINCe0YjQuNCx0LrQsCDQutC+0LzQv9C40LvRj9GG0LjQuAoJRCogZCA9IGR5bmFtaWNfY2FzdDxEKj4oYik7IC8vINCS0YvRj9GB0L3Rj9C10Lwg0Y/QstC70Y/QtdGC0YHRjyDQu9C4INC/0LXRgNC10LzQtdC90L3QsNGPIGIg0YLQuNC/0L7QvCBECglpZiggZCApIAoJewoJCWQtPmYoKTsgLy8g0JLRi9C30YvQstCw0LXQvCDRgtC+0LvRjNC60L4g0LXRgdC70Lgg0LTQtdC50YHRgtCy0LjRgtC10LvRjNC90L4g0Y/QstC70Y/QtdGC0YHRjwoJfQoJCglkZWxldGUgYjsKCQoJcmV0dXJuIDA7Cn0=