要使用dynamic_cast动态类型转换,必须满足下面条件: 1、基类至少要有一个虚函数 2、需要多态性 3、编译器打开RTTI检查 dynamic_cast功能: 当某些情况下不能使用运行时多态的时候,就可以用dynamic_cast代替,例如: struct Base { virtual void func(){} }; struct D : public Base { void func(){} void f(){} }; void test(Base* b) { /* 如果要进行强制转换,则需要保证转换是正确的。 */ if(D* d = dynamic_cast<D*>(b)) d->f(); else cout << "change fail !" << endl; } void main() { /* d通过函数test进行传参,通过转换变为Base类型的指针 如果想转换回之前指向D类的指针,可以使用强制转换 但这个转换必须是我们知道的,如果转换失败,则返回 0。如果是引用转换失败,抛出bad_cast异常。 */ D* d = new D; test(d); }