zoukankan      html  css  js  c++  java
  • Hello,C++(4)继承

    继承

    类之间的关系:包含、使用、继承

     继承重要说明

    1)子类继承了父类的全部成员变量和成员方法(除了构造和析构之外的成员方法)

    2)子类可以拥有父类没有的方法和属性

    3)父类若有带参数的函数,可以将子类作为参数传递进去)

    4)子类就是一种特殊的父类,子类对象可以当作父类对象使用

    (儿子至少比父亲强:成员变量和方法至少比父亲多;儿子可以调用父亲的带参数函数;儿子也可以成为父亲)

    子类对外访问属性表

    “三看”原则判断能否访问(从外到内)

    C++中的继承方式(public、private、protected)会影响子类的对外访问属性

    判断某一句话,能否被访问

             1)看调用语句,这句话写在子类的内部、外部

             2)看子类如何从父类继承(public、private、protected)  

             3)看父类中的访问级别(public、private、protected)

    (protect是为家族使用)

    (在项目开发中,一般用public)

    继承中的构造和析构

    • 类型兼容性原则

    类型兼容规则是指在需要基类对象的任何地方,都可以使用公有子类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容规则中所指的替代包括以下情况:

    子类对象可以当作父类对象使用

    子类对象可以直接赋值给父类对象

    子类对象可以直接初始化父类对象

    父类指针可以直接指向子类对象

    父类引用可以直接引用子类对象

    在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。

    类型兼容规则是多态性的重要基础之一。

    总结:子类就是特殊的父类 (base *p = &child;)

    #include <cstdlib>
    #include <iostream>
    using namespace std;
    /*
    
    子类对象可以当作父类对象使用
    
             子类对象可以直接赋值给父类对象
    
             子类对象可以直接初始化父类对象
    
             父类指针可以直接指向子类对象
    
             父类引用可以直接引用子类对象
    
             */
    
    //子类就是特殊的父类
    
    class Parent03
    
    {
    protected:
             const char* name;
    public:
    
             Parent03()
    
             {
                   name = "Parent03";
             }
     
             void print()
    
             {
                   cout<<"Name: "<<name<<endl;
             }
    
    };
    
    class Child03 : public Parent03
    {
    protected:
             int i;
    public:
             Child03(int i)
    
             {
                       this->name = "Child2";
                       this->i = i;
             }
    
    };
    int main()
    
    {
             Child03 child03(1000);
    
             //分别定义父类对象 父类指针 父类引用 child
             Parent03 parent = child03;
             Parent03* pp = &child03;
             Parent03& rp = child03;
    
             parent.print();
             pp->print();
             rp.print();
             system("pause");
             return 0;
    }

    问题:如何初始化父类成员?父类与子类的构造函数有什么关系

             在子类对象构造时,需要调用父类构造函数对其继承得来的成员进行初始化

             在子类对象析构时,需要调用父类析构函数对其继承得来的成员进行清理

     
    • 继承中的构造析构调用原则

    1、子类对象在创建时会首先调用父类的构造函数

    2、父类构造函数执行结束后,执行子类的构造函数

    3、当父类的构造函数有参数时,需要在子类的初始化列表中显示调用

    4、析构函数调用的先后顺序与构造函数相反

    • 继承与组合混搭情况下,构造和析构调用原则

             原则:    先构造父类,再构造成员变量、最后构造自己

                              先析构自己,在析构成员变量、最后析构父类

    继承中的重名成员变量处理方法

    1、当子类成员变量与父类成员变量同名时

    2、子类依然从父类继承同名成员

    3、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符

    4、同名成员存储在内存中的不同位置

    总结:同名成员变量和成员函数通过作用域分辨符进行区分

    派生类中的static关键字

    继承和static关键字在一起会产生什么现象哪?

    理论知识

    • 基类定义的静态成员,将被所有派生类共享
    • 根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质 (遵守派生类的访问控制)
    •  派生类中访问静态成员,用以下形式显式说明:

                              类名 :: 成员

    或通过对象访问    对象名 . 成员

    静态数据成员的初始化必须显式地初始化在外面。这句话告诉编译器分配内存,否则无法继承。

    总结:

    1> static函数也遵守3个访问原则

    2> static易犯错误(不但要初始化,更重要的显示的告诉编译器分配内存)

    3> 构造函数默认为private

    多继承的应用

    多继承概念

    •   一个类有多个直接基类的继承关系称为多继承
    •   多继承声明语法

    class  派生类名 : 访问控制  基类名1访问控制  基类名2 ,  … , 访问控制  基类名n

        {

             数据成员和成员函数声明

        };

    •   类 C 可以根据访问控制同时继承类 A 和类 B 的成员,并添加

         自己的成员

    虚继承

      如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性(用虚继承来解决)

    总结:

    •   如果一个派生类从多个基类派生,而这些基类又有一个共同

         的基类,则在对该基类中声明的名字进行访问时,可能产生

         二义性

    •   如果在多条继承路径上有一个公共的基类,那么在继承路径的某处

         汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象

    •   要使这个公共基类在派生类中只产生一个子对象,必须对这个基类

         声明为虚继承,使这个基类成为虚基类。

    •   虚继承声明使用关键字          virtual

    继承总结

    • 继承是面向对象程序设计实现软件重用的重要方法。程序员可以在已有基类的基础上定义新的派生类。
    •  单继承的派生类只有一个基类。多继承的派生类有多个基类。
    •  派生类对基类成员的访问由继承方式和成员性质决定。
    •  创建派生类对象时,先调用基类构造函数初始化派生类中的基类成员。调用析构函数的次序和调用构造函数的次序相反。
    •  C++提供虚继承机制,防止类继承关系中成员访问的二义性。
    •  多继承提供了软件重用的强大功能,也增加了程序的复杂性。
  • 相关阅读:
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    flowable 获取当前任务流程图片的输入流
    最新 接口api插件 Swagger3 更新配置详解
    springboot 集成 activiti 流程引擎
    java 在线考试系统源码 springboot 在线教育 视频直播功能 支持手机端
    阿里 Nacos 注册中心 配置启动说明
    springboot 集成外部tomcat war包部署方式
    java 监听 redis 过期事件
    springcloudalibaba 组件版本关系
    java WebSocket 即时通讯配置使用说明
  • 原文地址:https://www.cnblogs.com/juanjuanduang/p/10847014.html
Copyright © 2011-2022 走看看