// 请简述static_cast、dynamic_cast和reinterpret_cast的区别，并给出示例代码进行说明。

// static_cast :
//  静态转换，用于基本类型的转换、隐式转换、向上转换和非多态类之间的转换。它在编译时进行类型检查，并且只能用于具有相关性的类型之间的转换。因为没有运行时类型检查，不能用于多态类的向下转换（即将基类指针或引用转换为派生类指针或引用）。

#include <iostream>

using namespace std;

int num = 10;
double res = static_cast<double>(num); // 将整数类型转换为浮点数类型

class Base
{
public:
    virtual void foo()
    {
        cout << "基类 foo() 函数" << endl;
    } // 基类的虚函数
};

class Derived : public Base
{
public:
    void bar()
    {
        cout << "派生类 bar() 函数" << endl;
    } // 派生类的成员函数
    void foo()
    {
        cout << "派生类 foo() 函数" << endl;
    } // 派生类的虚函数: 重写基类的虚函数
};

int main()
{
    Base *p = new Derived();
    Derived *dp = static_cast<Derived *>(p); // 向下转换，不安全
    dp->bar();                               // 但是可以调用派生类的成员函数
    dp->foo();
    return 0;
}
