• 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++提供虚继承机制,防止类继承关系中成员访问的二义性。
    •  多继承提供了软件重用的强大功能,也增加了程序的复杂性。
  • 相关阅读:
    【143】360云盘资源
    【142】阿蛮歌霸使用技巧
    [置顶] 程序员必知(三):一分钟知道URI编码(encodeURI)
    [置顶] Oracle job procedure 存储过程定时任务
    浅析动态表单
    DoctorNote医生处方笔记开发记录
    Step2:配置Oracle Dataguard
    IOS开发UIImage中stretchableImageWithLeftCapWidth方法的解释
    解析客户端脚本、服务器端脚本
    tomcat目录结构
  • 原文地址:https://www.cnblogs.com/juanjuanduang/p/10847014.html
Copyright © 2020-2023  润新知