#include <iostream>
using namespace std;
class A {
public:
virtual void display() { cout << "A::display()" << endl; }
};
class B : public A {
public:
void display() { cout << "B::display()" << endl; }
};
int main()
{
A a;
B b;
A* pa;
B* pb;
pa = &b; //多态性
pa->display(); //输出B::display()
pb = (B*)pa; //由于pa是指向B类对象的,所以这里可以这样写,但是不安全
pb->display(); //输出B::display()
//dynamic_cast必须用在使用了虚函数的类的继承层次中,否则编译出错
pb = dynamic_cast<B*>(pa); //注意括号不能少
if (pb != nullptr) //条件为真
pb->display(); //输出B::display()
pa = &a;
pb = nullptr;
pb = (B*)pa; //如果不用dynamic_cast,这里的转换仍会发生,所以这种写法是错误的
pb->display(); //输出A::display()
pb = dynamic_cast<B*>(pa); //由于pa指向A类对象,所以这里的转换不会成功,pb为nullptr
if (pb != nullptr) //条件为假
pb->display(); //不执行
}
输出结果: