【C++语法实践】11-C++ 运行时类型检查

#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;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部