#include <iostream> #include <vector> using namespace std; class Shap { public: virtual void Draw() = 0; virtual ~Shap() {} }; class Circle : public Shap { public: void Draw() { cout << "Circle Draw ..." << endl; } }; class Square : public Shap { public: void Draw() { cout << "Square Draw ..." << endl; } }; int main() { Shap* shap; Circle circle; shap = &circle; // Square tmpSquare; // shap = &tmpSquare; // 1.使用dynamic_cast转换会比虚函数的开销更大 // 2.需要编译器开启运行时类型支持,如果关闭:编译会有警告,运行错误,不支持运行时类型识别 // 3.需要用在具有多态关系的继承体系上,也就是基类有虚函数 if (dynamic_cast<Circle*>(shap)) // 安全的向下转型 { cout << "Circle ..." << endl; // 运行时类型检查 // cout << typeid(*shap).name() << endl; if (typeid(*shap).name() == typeid(Circle).name()) { cout << "shap class Circle" << endl; Circle* tmpCircle = (Circle*)shap; // 转换成Circle指针是安全的,因为我们已经知道它指向了一个Circle对象 // typeid返回的是typeinfo的引用 // 但是我们不能直接顶一个typeinfo对象,将typeid赋值 // typeinfo类中拷贝构造函数和等号运算符是私有的 } Circle* cp = dynamic_cast<Circle*>(shap); // 抽象类的基类向派生类转型,安全的向下转型,运行类型检查 cp->Draw(); // 调用Circle Draw方法 } else if (dynamic_cast<Square*>(shap)) cout << "Square ..." << endl; else if (dynamic_cast<Shap*>(shap)) cout << "Shap ..." << endl; else cout << "Other ..." << endl; return 0; }