浏览器标题切换
浏览器标题切换end

C++ - 向上转型

  1. 简单来说:向上转型就是将子类转化成父类

  2. 数据类型转换,编译器会直接将小数部分丢掉。比如:int a=6.6,输出%d的时候就是6

  3. 只能将派生类赋值给基类 : 派生类对象赋值给基类对象、将派生类指针赋值给基类指针、将派生类引用赋值给基类引用

  4. 派生类对象赋值给基类对象,舍弃派生类新增的成员

  5. 派生类指针赋值给基类指针,没有拷贝对象的成员,也没有修改对象本身的数据,仅仅是改变了指针的指向

  6. 派生类引用赋值给基类引用,和指针的一样。

  7. 第2-第6点总结来说就是:向上转型后通过基类的对象、指针、引用只能访问到从基类继承过去的成员(包括成员变量和成员函数),不能访问派生类新增的成员

向上转型例子

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

class Father
{
public:
//    Father();
//    ~Father();

    string firstName,lastName;
    void print()
    {
        cout<<"father's firstName is : "<<this->firstName<<endl;
        cout<<"father's lastName is : "<<this->lastName<<endl;
    }

private:

};

class Child:public Father
{
public:
//    Child();
//    ~Child();

  //  string lastName; 因为是public继承,所以子类可以访问一切父类中的变量,不用再次定义
    void print()
    {
        cout<<"child's firstName is : "<<this->firstName<<endl;
        cout<<"child's lastName is : "<<this->lastName<<endl;
    }

private:

};

int main()
{
    Father father;
    father.firstName="Jack";

    Child child;
    child.firstName="bob";
    child.lastName="Hansen";

    father=child;
    father.print();
    // 输出:
    // father's firstName is : bob
    // father's lastName is : Hansen

    child.print();
    // 输出:
    // child's firstName is : bob
    // child's lastName is : Hansen

    // system("pause");   // Clion带stdlib.h头文件还报错!?
    return 0;
}

向上转型的安全性

  • static_cast 静态转型/向上转型。向上转型比较安全,可以由编译器自动完成,不会有数据的丢失。在编译期间转换,转换失败的话会抛出一个编译错误。因为在编译期间就完成了类型转换,所以能够更加及时地发现错误。

  • 向下转型:可以使用强转,向下转型是不安全的,需要程序员自己处理,有可能会导致数据的丢失,原因是父类的指针或者引用的内存中可能不包含子类的成员的内存。

  • dynamic_cast:用在类的继承层次之间进行类型转换,允许向上转型(无条件的,不会进行任何检测,所以都能成功)和向下转型(向下转型的前提必须是安全的,要借助 RTTI 进行检测,所有只有一部分能成功)。

参考

  1. https://blog.csdn.net/qq_43469158/article/details/110680163

  2. https://blog.csdn.net/in_zihuatanejo/article/details/53396314

posted @   抓水母的派大星  阅读(300)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示