【C++】从代码示例入手(六) 类型转换

   《C++从代码示例入手》系列文章将带你开启 C++编程的探索之旅。通过大量简单且实用的代码示例,由浅入深地展现 C++的核心知识点,包括变量、数据类型、运算符、控制结构、函数等。每一个代码示例都有详细的解释和注释,让你能轻松理解代码的功能和运行原理,助你逐步掌握 C++的编程技巧,快速提升编程能力,为后续深入学习和开发打下坚实基础。 

 关于IDE开发工具的运行环境安装配置,请参看:【C 语言】从代码示例入手(零)

        各位朋友在学习C++之前最好可以先学习一下C语言的基础知识,因为C语言和C++还可以混合编程,语法也类似一些,最重要的是指针内存方面的知识还是需要知道一些的。

具体可以参看:【C 语言】从代码示例入手 


目录

一、父类与子类类型转换 

1、指针类型转换

(1)基本转换01

(2)基本转换02

二、typeid的应用(判断类型)

三、类型转换的类型

1、类型转换名称和语法

(1) C风格的强制类型转换(Type Cast)

(2) C++风格的类型转换

 (3)静态类型转换static_cast举例

(4)强制类型转换reinterpret_cast举例

(5)父类与子类之间的多态类型转换dynamic_cast举例

(6)去const属性转换const_cast举例


一、父类与子类类型转换 

  • dynamic_cast应用
  • 使用dynamic_cast转换的Base类至少带有一个虚函数

1、指针类型转换

(1)基本转换01

源代码:

#include <iostream>
using namespace std;

//基类
class Base {
    public:
        Base() {};
        //虚函数
        virtual void show() { cout << "This is Base calss"<<endl; }
};

//子类
class Sub :public Base {
    public:
        Sub() {};
        //实现虚函数
        void show() { cout << "This is Sub class"<<endl; }
        //普通函数
        void subFun() { cout << "This is subFun()"<<endl; }
};

int main() {
    //1、创建父类与子类对象
    Base *base;
    Sub *sub = new Sub;

    //2、子类转父类
    //base = dynamic_cast<Base*>(sub); //正确,但不必要。
    base = sub; //向上转换总是安全的

    //3、父类调用Show()
    base->show();   // This is Sub class      子类转父类,安全,且转换后,还是调用子类的虚函数,
    //base->subFun(); //ERR: subFun不是Base的成员   子类转父类,安全,但是转换后,不能再使用子类的非虚函数,

    //4、父类转子类
    sub = dynamic_cast<Sub*>(base);

    //5、子类调用Show()、subFun()
    sub->show();
    sub->subFun();
    return 0;
}

运行结果:

代码说明:

  • Base
    • 定义了一个默认构造函数 Base(),用于创建 Base 类的对象。
    • 定义了一个虚函数 show(),使用 virtual 关键字修饰,这使得该函数具有多态性。当通过基类指针或引用调用该函数时,会根据实际对象的类型来决定调用哪个版本的 show() 函数。
  • Sub
    • 继承自 Base 类,使用 public 继承方式,表示基类的 publicprotected 成员在子类中保持原有访问权限。
    • 定义了一个默认构造函数 Sub(),用于创建 Sub 类的对象。
    • 重写了基类的虚函数 show(),提供了子类自己的实现。
    • 定义了一个普通成员函数 subFun(),该函数是 Sub 类特有的,基类中没有该函数。
  • Sub sub01;:创建一个 Sub 类的对象 sub01,调用 Sub 类的默认构造函数进行初始化。
  • Sub & sub02 = sub01;:声明一个 Sub 类的引用 sub02,并将其初始化为引用 sub01。引用是对象的别名,sub02sub01 实际上指向同一个对象。
  • Base & base = dynamic_cast<Base&>(sub02);
    • 使用 dynamic_cast 进行类型转换,将 Sub 类的引用 sub02 转换为 Base 类的引用 base
    • 这是一个向上类型转换,因为 Sub 类是 Base 类的子类。向上类型转换是安全的,因为子类对象包含了基类对象的所有成员。dynamic_cast 在这里确保了类型转换的安全性,并且会在运行时检查类型信息。
  • base.show();
    • 通过 Base 类的引用 base 调用 show() 函数。
    • 由于 show() 是虚函数,根据多态性原理,实际调用的是 Sub 类中重写的 show() 函数,因此会输出 "This is Sub class"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超越超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值