zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    面试笔记之手写单例模式
    Java学习笔记六:Java最基础
    Mac下终端工具iTerm2的快捷键
    Typescript引用类型--字符串
    Typescript引用类型--数组
    Typescript函数作用域
    Typescript的函数定义方式
    初识Typescript以及Typescript的安装
    VS Code前端开发常用插件和常用快捷键
    Vue CLI3项目构建
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14576142.html
Copyright © 2011-2022 走看看