【C++语法实践】08-C++ overwrite,overload,override,转换方式

overwrite重写,派生类具有和基类相同的函数名(参数可以一样也可能不一样)

overload重载,具有相同作用域的相同的函数名

override覆盖,基类有虚函数,派生类实现该虚函数

static_cast 用于编译器认可的静态转换。比如说从char 到 int, 从double 到 int, 或者具有转换构造函数,或者重载类型转换运算符

reinterpret_cast 用于编译器不 认可的静态转换,从int* 转换为 int ,在转换过程中,不做任何对齐

const_cast 去除常量性

dynamic_cast 用于动态转换,安全的向下转型。多态

C风格强制转换 会做部分对齐操作

dynamic_cast

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

    // 1.使用dynamic_cast转换会比虚函数的开销更大
    // 2.需要编译器开启运行时类型支持,如果关闭:编译会有警告,运行错误,不支持运行时类型识别
    // 3.需要用在具有多态关系的继承体系上,也就是基类有虚函数
    if (dynamic_cast<Circle*>(shap)) // 安全的向下转型
    {
        cout << "Circle ..." << endl;
        Circle* cp = dynamic_cast<Circle*>(shap); // 抽象类的基类向派生类转型,安全的向下转型,运行类型检查
        cp->Draw(); // 调用Circle Draw方法
    }
    else if (dynamic_cast<Shap*>(shap))
        cout << "Shap ..." << endl;
    else
        cout << "Other ..." << endl;

    return 0;
}

发表回复

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

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

返回顶部