精华内容
下载资源
问答
  • 类的继承和派生
    千次阅读
    2019-09-03 23:21:11

    一、类的继承与派生:

         1、类的继承是新的类从已有类那里得到已有的特性

         2、 从已有类产生新类的过程就是类的派生;

         3、类的继承与派生机制允许程序员在保持原有类特性的基础上,进行更具体,更详细的修改和扩充;

         4、由原有的类产生新类时,新类便包含了原有类的特征,同时也加入自己所特有的新特性。

    二、派生类的定义:

       1、一般定义语法:

         class 派生类名:继承方式 基类名1,继承方式  基类名2……继承方式  基类名n

           {    派生类成员声明  }

    继承方式:public  、   protected   、private;

      2、多继承:一个派生类,可以同时有多个基类;

            单继承:只有一个直接基类的情况;

            直接基类:在类族中,直接参与派生出某类的基类;

            间接基类:基类的基类甚至更高层的基类;

    3、派生类过程:

        1)吸收基类成员

              将基类成员全盘接受,除基类中的构造函数和析构函数;

        2)改造基类成员

            如果派生类声明了一个和某基类成员同名的新成员(如果是成员函数,则参数表也要相同,参数表不同属于重载),派生的          新成员就隐藏了外层同名成员;

    同名隐藏:在派生类中或者通过派生类的对象,直接使用成员名就只能访问到派生类中声明的同名成员;

        3)添加新的成员

    4、类中成员的访问:

        public:在本类,派生类,类外都可以访问;

        protected:在本类,派生类可以访问;

        private:只能在本类访问;

    三、继承方式:

    1、 继承方式决定了基类成员在派生类中的最高访问权限;

    2、派生类的访问:

    1)如果派生类中声明了与基类成员函数同名放入新函数,即使函数的参数表不同,从基类的同名函数的所有重载形式也都会被           隐藏。若要访问被隐藏的成员,就需要使用作用域分辨符和基类名来限定;

    2)对于多继承,首先考虑各个基类没有之间没有任何继承关系,同时也没有共同基类的情况。

          a、如果某派生类的多个基类拥有同名的成员,同时,派生类又新增这样的同名成员,在这种情况下,派生类成员将隐藏所有              基类的同名成员;使用“ 对象名.成员名 ”的访问方式,只能访问到派生类新增的成员;

          b、如果某个派生类的部分或全部直接基类是从另一个共同的基类派生而来,在这些直接基类中,从上一级基类继承来的成员             就拥有相同的名称,因此派生类中也就会产生同名现象,对这种类型的同名成员也要使用作用域分辨符来唯一标识,而且             必须用直接基类来进行限定;

    四、派生类的构造和析构:

       1、派生类构造函数:

    派生类的成员对象是由所有基类的成员对象与派生类新增的成员对象共同组成,因此构造派生类的对象时,就要对基类的成员对象和新增的成员对象进行初始化。

    一般语法形式:

      派生类名::派生类名(参数表)

    :基类名1(基类1初始化参数表),…基类名n(基类n初始化参数表),成员对象名m(成员对象 m初始化参数表)

    {  派生类构造函数的其他初始化操作  }

    派生类构造函数执行顺序:

     1)传参;

    2)调用基类构造;

    3)按照类中成员变量声明顺序,构造成员变量;

    4)函数体。

    2、派生类的析构函数:

     派生类的析构函数的功能是在该类对象消亡之前进行一些必要的清理工作。

         析构函数执行顺序:

    1)函数体;

    2)按照成员变量声明顺序逆序,依次析构成员变量;

    3)基类析构函数。

    五、类型兼容规则

    类型兼容性规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代;

    这里的替代包括以下情况:

       1)派生类的对象可以隐含转化为基类对象;

       2)派生类的对象可以初始化基类的引用;

       3)派生类的指针可以隐含转化我基类的指针;

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

    六、虚基类

     当某类的部分或全部直接基类是从另一个共同基类派生而来时,在这些直接基类中从上一级共同基类继承来的成员就拥有相同的名称。在派生类的对象中,这些同名数据成员在内存中同时拥有多个副本,同一个函数名会有多个映射。可以使用作用域分辨符来唯一标识分别访问,也可以将共同基类设置为虚基类;

    这时从不同路径继承过来的同名数据成员在内存中就只有一个副本,同一个函数名也只有一个映射。

    虚基类的声明是在派生类的定义过程中进行的,语法为:

    class 派生类名:virtual 继承方式  基类名;

    构造一个类的对象的一般顺序:
       1)如果该类有直接或间接的虚基类,则先执行虚基类的构造函数;

       2)如果该类有其他基类,则按照他们在继承声明列表中出现的次序,分别执行它们的构造函数,但构造函数过程中,不再执行它们的虚基类的构造函数;

       3)按照在类定义中出现的顺序,对派生类中新增的成员对象进行初始化。对于类类型的成员对象,如果出现在构造函数初始化列表中,则以其中指定的参数执行构造函数,如未出现,则执行默认构造函数,对于基本数据类型的成员对象,如果出现在构造函数的初始化列表中,则使用其中指定的值为赋初值,否则什么也不做;

    4)执行构造函数的函数体;

     

     

     

     

     

     

    更多相关内容
  • 所以继承和派生的关系就像小学时把字句被字句的造句一样。有了继承派生后,就有了父类/基类与子类/派生类,C++中将B称为父类/基类,将A称为子类/派生类派生类的声明: #include using namespace std;...
  • 继承派生实验

    2013-12-03 13:16:19
    1:掌握单继承和继承派生类的定义方法,理解基类成员在不同的继承方式下不同的访问属性。 2:正确定义派生类的构造函数与析构函数,理解定义一个派生类对象时构造函数、析构函数的调用次序。 3:理解同名冲突的...
  • 第九章继承与派生 92 典型例题分析与解答 例题 1下列对派生的...答案D 分析一个派生可以作为另一个派生的基类无论是单继承还是多继承派生类至少有 一个基类派生的成员除了它自己的成员外还包含了它的基类成员
  • 1、单继承:class 派生类名:访问方式 基类名{ 派生类成员} 说明: 1.派生类名由用户自己命名 2.访问方式:公有、私有、保护 3.基类名必须是程序一个已有的 4.冒号:告诉系统,派生类从那个基类派生 5.派生类...
  • 继承派生

    千次阅读 2022-03-27 20:43:57
    一、继承派生 在C++中,具有继承性,所谓继承就是在一个已存在的的基础上建立一个新的。 利用继承,可以将原来的程序代码重复使用,从而减少了程序代码的冗余度,符合软件重用的目标。增强编程语言的...

    类及对象的访问权限:

    类中的成员函数可以直接访问类中的数据成员(包括私有成员、公有成员、保护成员);

    类中的成员函数可以相互访问;

    类的对象只能访问类的公有成员,不能访问私有成员及保护成员。


     一、继承与派生

    在C++中,类具有继承性所谓继承就是在一个已存在的类的基础上建立一个新的类。

            利用类的继承,可以将原来的程序代码重复使用,从而减少了程序代码的冗余度,符合软件重用的目标。增强编程语言的功能。提高软件开发效率。

    在继承关系中,被继承的类称为基类(或父类把通过继承关系创建出来的新类称为派生类(子类)。

    派生类不仅可以继承原来类的成员,还可以通过以下方式产生新的成员:
    1.增加新的数据成员;
    2.增加新的成员函数;
    3.重新定义已有成员函数;
    4.改变现有成员的属性。


    继承的特点:

    1>继承具有层次结构。
    2>越在上面的类越具有普通性和共性,下层比上层更具体,越在下层越细化、专门化。
    3>继承具有传递性,即派生类能自动继承上层基类的全部数据结构及操作方法(数据成员及成员函数)

    基类与派生类的对应关系:

    单继承:

    一个派生类只从一个基类派生,这是最常见的继承形式

    多重继承;

    一个派生类有两个及两个以上的基类。如:类C从类A和类B派生。

    多重派生:

    由一个基类派生出多个不同的派生类。

    多层派生:

    每一个派生类又可以作为基类,再派生出新的派生类。

     基类和派生类之间的关系:

    1.基类是对派生类的抽象,派生类是对基类的具体化。基类抽取了它与派生类的公共特征,而派生类通过增加信息将抽象的基类变为某种具体的类型。
    2.派生类是基类的组合,可以把多重继承看作是多个单一继承的简单组合。

    二、派生类的声明方式

    定义派生类的一般形式:

    class 派生类名:继承方式 基类名

            派生类新增加的成员

    };

    继承方式有public(公有继承)、protected(保护继承)和private(私有继承)

    1. private方式继承(私有继承):

            基类中的公有成员和保护成员在派生类中皆变为私有成员。

    2.public方式继承(公有继承):

    基类的公有成员和保护成员被继承为派生类成员时,其访问属性不变。

    3.protected方式继承(保护继承):

    基类的公有成员和保护成员在派生类中成了保护成员,私有成员仍为基类私有。

    无论哪种继承方式,基类的私有成员均不能继承。这与私有成员的定义是一致的,符合数据封装的思想。

    三、派生类的构成

    1>在一个派生类中,其成员由两部分构成:

            1.从基类继承得到的成员

            2.自己增加的新成员

    2>友元关系不能继承。
    一方面,基类的友元对派生类的成员没有特殊访问权限。
    另一方面,如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。

    3>如果基类定义了静态成员
    无论从基类派生出多少个派生类,基类定义的静态成员,不受继承方式的影响,在整个类层次体系中都可以访问。

    4>派生类中访问静态成员,必须用显式说明

                    类名::成员

    一个派生类应包括4个方面:

    1)从基类接收成员

    除了构造函数和析构函数,派生类会把基类全部的成员继承过来。这种继承是没有选择的,不能选择接收其中一部分成员,而舍弃另一部分成员。

    2)调整基类成员的访问

    派生类接收基类成员是程序员不能选择的,但是程序员可以对这些成员作出访问策略。

    3)修改基类成员

    可以在派生类中声明一个与基类成员同名的成员,则派生类中的新成员会覆盖基类的同名成员,就实现了修改基类成员功能的效果。特别注意,如果是成员函数,不仅函数名相同,而且函数的参数个数和类型都要相同。

    4)在定义派生类时增加新的成员

    一般还应当自己定义派生类的构造函数和析构函数。

    派生类成员的访问属性

    私有成员只能被同一类中的成员函数访问。基类的成员函数不能直接访问派生类的成员。

    不同的继承方式决定了基类成员在派生类中的访问属性。

    公有继承:

    基类的公有成员和保护成员在派生类中保持原有访问属性,私有成员仍为基类私有。

    私有继承:

    基类的所有成员在派生类中为私有成员。

    保护继承:

    基类的公有成员和保护成员在派生类中成了保护成员,私有成员仍为基类私有。

    无论采用何种继承方式得到的派生类,派生类成员及其友元都不能访问基类的私有成员,派生类外部的用户只能访问公有属性的成员。
    多级派生的情况下,保护继承和私有继承会进一步地将基类的访问权限隐蔽成不可访问的。
    一般地,保护继承与私有继承在实际编程中是极少使用的,它们只在技术理论上有意义。


    四、公用继承

    基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可访问。

    派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。

    通过派生类的对象只能访问基类的public成员。

    派生类的对象可以通过调用基类的公有成员函数访问基类的私有成员一一打通了派生类访问基类私有成员的消息通道。

     1) 通过调用基类的公有成员函数访问——直接消息通道

         格式:派生类对象. 基类公有成员函数名( )

           或:派生类对象.基类名::基类公有成员函数名( );

     2) 通过调用派生类公有成员函数,在公有成员函数中

        调用基类的公有成员函数访问。     ——间接消息通道

      格式:派生类对象->派生类公有成员函数->基类公有成

                  员函数->基类私有成员                           

                 

     五、私有继承

    基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可访问。
    在派生类中“私有化”,不能再继承,但在当前类内还可用。
    派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。通过派生类的对象不能访问基类中的任何成员。

    派生类的对象不能访问基类的任何成员(公有成员在派生类中已变为私有,不能被对象访问)——隔断了派生类对象访问基类私有数据成员的消息通道;

    但在私有继承下可以在派生类中设置专门的成员函数调用基类的公有成员函数,通过其访问基类的私有成员。

    私有继承方式下,派生类对象访问基类私有成员的消息通路:

     派生类对象->派生类公有成员函数->基类公有成员函数->基类私有成员                              

                                                                                    —— 间接消息通道。

    访问保护成员:

    派生类对象->派生类公有成员函数->基类保护成员

                                                                            —— 间接消息通道。

     六、保护成员和保护继承

    基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可访问。
    派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。通过派生类的对象不能访问基类中的任何成员。

     protected 成员的特点与作用

    1.对建立其所在类对象的模块来说(水平访问时),它与 private 成员的性质相同。

    2.对于其派生类来说(垂直访问时),它与 public 成员的性质相同。

    3.既实现了数据隐藏,又方便继承,实现代码重用。        

    七、派生类成员的访问属性

    同名隐藏

    ——非virtual,同名同参或不同参

    ——virtual 同名不同参(同参就覆盖了)

    派生类定义了与基类同名的成员时,称派生类成员隐藏了基类的同名成员

    若在在派生类中使用基类的同名成员时,显式地使用类名限定符

                类名 :: 成员

    class base
    {
    public:
    	int a, b;
    
    };
    class derive :public base
    {
    public:
    	int b, c;
    };
    int main()
    {
    	derive d;
    	d.a = 1;
    	d.base::b = 2;//s使用base类的b
    	d.b = 3;//使用derive类的b
    	d.c = 4;
    	return 0;
    }

    派生类中的静态成员

    基类定义的静态成员,不受继承方式的影响,在整个类层次体系中都可以访问。

    派生类中访问静态成员,必须用以下形式显式说明

              类名 :: 成员

    三种继承方式之间的比较

     多级派生时的访问属性

    多级派生:每一个派生类又可以作为基类,再派生出新的派生类。

     特点:
    1.无论采用何种继承方式得到的派生类,在派生类中不能访问基类的私有成员,私有成员只能被本类的成员函数访问。
    2.如果在多级派生时都采用公有继承方式,直到最后一级派生类都能访问基类的公用成员和保护成员。

    八、派生类的构造函数和析构函数

    在定义派生类时,派生类并没有把基类的构造函数和析构函数继承下来。因此,对继承的基类成员初始化的工作要由派生类的构造函数承担,同时基类的析构函数也要被派生类的析构函数来调用。在创建派生类的对象时,由于派生类的对象包含了基类的数据成员.因此派生类的构造函数除初始化其自身定义的数据成员外.还必须对基类中的数据成员进行初始化。即派生类的构造函数要负责调用基类的构造函数。

    单继承派生类的构造函数

    单继承派生类构造函数的定义:

    在执行派生类的构造函数时,使派生类的数据成员和基类的数据成员同时都被初始化。

    定义形式为:

    派生类构造函数名(总形参表):基类构造函数名(参表

    {

            派生类新增数据成员初始化语句

    }

    说明:
    1.总形参表包含基类构造函数的参数和派生类新增的数据成员。

    2.基类构造函数名(实参表)是调用基类构造函数,而派生类新增加的数据成员可以在派生类初
    初始化,也可以在派生类初始化函数体中初始化。

    在建立对象时,派生类构造函数的执行顺序:

    ①在执行派生类构造函数时,先调用基类构造函数;
    ②再执行派生类构造函数;

    #include<iostream>
    using namespace std;
    #include<string>
    
    class student
    {
    public:
    	student(int n, string m, float s)
    	{
    		num = n; name = m; score = s;
    	}
    protected:
    	int num; string name; float score;
    };
    class student1 :public student
    {
    public:
    	student1(int n, string m, float s, int a, string sub) :student(n, m, s)
    	{
    		age = a; subject = sub;
    	}
    	void display();
    private:
    	int age;
    	string subject;
    };
    void student1::display()
    {
    	cout << "num:" << num << endl;
    	cout << "name:" << name << endl;
    	cout << "score:" << score << endl;
    	cout << "age" << age << endl;
    	cout << "subject:" << subject << endl;
    }
    int main()
    {
    	student1 stu(101, "zhangsan", 86, 18, "jisuanji");
    	stu.display();
    	return 0;
    }

    有子对象的派生类的构造函数

    类中的数据成员可以是类对象,类对象中的内嵌对象称为子对象,即对象中的对象

    说明:

    如果类A史有类B的子对象,类B有默认构造函数,或者参数全是默认参数的构造函数,或者有无参数的构造函数,那么类A的构造函数中可以不用显式初始化子对象。编译器总是会自动调用B的构造函数进行初始化。
    也可以在一个类的构造函数中显式地初始化其子对象,初始化式只能在构造函数初始化列表中。

    派生类中含有对象时构造函数的定义形式:

        派生类构造函数名(总参表): 基类构造函数名(参表)

         对象名(参表)

           派生类新增数据成员初始化语句   }

    在建立对象时,构造函数的调用顺序为

    调用基类构造函数,对基类数据成员初始化

    调用子对象构造函数,对子对象数据成员初始化

    执行派生类构造函数,对派生类数据成员初始化

    多层派生时的构造函数

    一个类不仅可以派生出一个派生类,派生类还可继续派生,形成派生的层次结构。

    和派生类的构造函数的表示

       构造函数名(参数表)  

               {  函数体   }

       派生1构造函数名(参数表): 基类构造函数名(参数表)   

               派生类新增数据成员初始化语句   }

       派生类2构造函数名(参数表): 派生类1构造函数名(参数表)   

            {  派生类新增数据成员初始化语句   }

    说明:在不要列出每一层派生类的构造函数,只须写出其上一层的构造函数。

    在建立对象时,构造函数的调用顺序为:

      在创建派生类2对象时,调用派生类2构造函数

      在执行派生类2构造函数先调用派生类1构造函数

      在执行派生类1构造函数时,先调用类构造函数

    展开全文
  • 继承派生总结

    2018-06-19 18:07:34
    c++继承派生总结 面向对象的程序设计中提供了继承机制,允许...以原有的为基础产生新的,我们就说新类继承了原有的特征,也就是说从原有类派生了新派生机制的好处在于:代码的重用和可扩充性。
  • 继承和派生复习

    2021-01-20 22:06:48
    继承和派生练习关于保护继承下列说法错误的是保护继承的特点是基类的所有公用成员保护成员都成为派生类的保护成员派生类对象不能访问基类中的任何成员派生类的对象可以访问基类的公有成员保护继承派生类和私有继
  • 给定一个头文件Vec.h,其中有抽象模板VECROR设计。还有插入运算符重载、抽取运算符重载的普通c++函数...1、将模板VECTOR作为基类,通过公共继承派生一个新的模板Vector(向量一个新的自定义字符串了String。
  • C++复习3 ----继承派生 为什么要继承 如果软件编写的工程规模很大重用已经测试过的代码要比重新编写新代码节省开发时间 基类与派生类 从已经定义的产生新的过程称为派生派生过程中已定义的称为基类...
  • 继承和派生

    千次阅读 2021-03-24 08:38:32
    从已有的类派生出新的派生类继承了原有(基类)的特征,包括成员方法 继承的功能 可以在已有的基础上添加新功能,如对于数组,可以添加数学计算 可以给添加数据成员,如对于字符串,可以派生...

    内容预览

    • 继承
      理解继承
      单继承下C++对象模型的内存分配
    • 派生类
      派生类与基类之间的特殊关系小结
      派生类成员的访问控制
      继承方式提供给程序员对类进行封装的机制

    继承

    • 理解继承

      在C++中,代码重用是通过“继承(inherittance)”机制实现的

       所谓“继承”就是在一个已经存在的类基础上,再建立一个新类
       从已有的类派生出新的类,派生类就继承了原有类(基类)的特征,包括成员和方法
      

      继承的功能

       可以在已有类的基础上添加新功能,如对于数组类,可以添加数学计算
       可以给类添加数据成员,如对于字符串类,可以派生出一个类,并添加指定成员表示颜色
       可以修改类方法的行为,如对于普通英雄类,可以派生出拥有更丰富技能的近战英雄类
      

      注意:
      继承机制只需提供新特性,甚至不需要访问源码就可以派生出类
      只有类方法的头文件和编译后的代码,仍然可以使用库中的类派生出新类

    • demon
      方案一:直接定义各个英雄类
      在这里插入图片描述
      方案二:使用继承
      在这里插入图片描述
      注意

       派生类对象存储了基类的数据成员。 即,派生类继承了基类的实现
       派生类对象可以使用基类的非私有函数。 即,派生类继承了基类的接口
       派生类需要自己的构造函数
       派生类可以根据需要添加额外的数据成员和函数
      
    • 单继承下C++对象模型的内存分配

      • 没有继承时,成员变量和成员函数会分开存储
        1.编译器会将成员变量和成员函数分开存储:分别为每个对象的成员变量分配内存,但是所有对象都共享同一段代码
        2.类可以看做是一种复杂的数据类型,如果使用sizeof求类所占空间的大小,只是计算了成员变量的大小,并没有把成员函数也包含在内
        在这里插入图片描述
      • 有继承关系时的内存模型
        派生类的内存模型可以看成是基类成员变量和新增成员变量的总和
        所有成员函数仍然存储在另外一个区域——代码区,由所有对象共享
        在这里插入图片描述
    • 注意:
      派生类的构造函数后于其基类的构造函数调用,但是析构函数先基类析构函数调用

    派生类

    • 派生类与基类之间的特殊关系小结
      在这里插入图片描述

    • 派生类成员的访问控制
      在这里插入图片描述
      公用继承(public inheritance)

       基类的公有成员和受保护成员,在派生类中保持原来的访问属性,其私有成员仍为基类
      

      私有继承(private inheritance)

       基类的公有成员和受保护成员,在派生类中成为了私有成员,私有成员仍为基类独有
      

      受保护继承(protected inheritance)

       基类公有成员和受保护成员,在派生类中成了受保护成员,私有成员仍为基类独有
      

      注意:

       1.公有权限下,自己、派生类及外部都可以访问
       2.私有权限下,只能自己访问,派生类及外部都无法访问
      
    • 继承方式提供给程序员对类进行封装的机制
      1.全部继承,不封装基类,那么用公有继承
      2.全部继承,完全封装基类,那么使用私有继承
      3.全部继承,有选择封装基类,那么使用受保护继承
      不管哪种继承,派生类都不能访问基类的私有成员(除非改成protected)
      注意 :

       以上三种选择是程序员在开发中运用面向对象思想的重要体现:
       	 	需要封装哪些成员变量和成员函数?
       	 	需要把哪些成员函数作为接口来被调用?
      

      公有继承
      在这里插入图片描述
      受保护继承
      在这里插入图片描述
      私有继承
      在这里插入图片描述

    • 继承与组合

      类的组合形式:在一个类中有另外一个类的对象作为数据成员

       1.通过继承建立了派生类与基类的关系,它是一种 is - a "是"的关系
       	比如,狗是哺乳动物,战士是英雄	
       2.类的组合关系,它们之间不是"是"的关系,而是"有"的关系
       	比如,学生有书包、战士有武器、机枪有子弹、老板有小蜜
       3.继承是纵向的,组合是横向的
      

      继承是C++与C最重要的区别之一

       C++源于C,C++最重要的特性就是引入了面向对象机制
       C++中通常也可以直接使用C语言的习惯进行编程
      
    展开全文
  • 实验三 派生继承 班级123班 姓名朱广金 学号122536 一实验目的 1学习继承能够定义和使用继承关系 2学习派生的声明与定义方法 3掌握的定义和对象的声明 4熟悉公有派生和私有派生的访问特性 5掌握派生...
  • 编写一个Shape派生出Circle类和Rectangle,观察运行机制。 shape有以下成员 1)私有成员m_ID 2)公有gettersetter 3)计算面积函数getArea(),返回0; 4)构造与析构函数 Circle从shape类继承,并派生...
  • c++继承和派生.doc

    2022-01-13 10:44:43
    根据c++第三版梳理的知识点。描述了第12章节继承和派生的知识点
  • 实验四 C++中的继承派生 一实验目的 理解C++中继承派生的概念 掌握C++中各种不同继承方式的访问属性差别 掌握单继承与多继承的实现方法 掌握派生类构造函数与析构函数的实现及调用顺序 掌握虚基类的使用方法 二...
  • 一、继承和派生 1、C++继承的概念及语法 继承之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。 继承(Inheritance) 可以理解为一个从另一个获取成员变量...

    一、继承和派生

    1、C++继承的概念及语法

    • 继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。

    • 继承(Inheritance) 可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。被继承的类称为父类或基类,继承的类称为子类或派生类。

    • 继承方式包括 public(公有的)、private(私有的)和 protected(受保护的),此项是可选的,如果不写,那么默认为 private。

    • demo语法

    class 派生类名:[继承方式] 基类名{
    派生类新增加的成员
    };

    //基类 Pelple
    class People{
    
    }
    //派生类 Student
    class Student: public People{
    
    }
    

    Student 类继承了 People 类的成员成员函数 。这些继承过来的成员,可以通过子类对象访问,就像自己的一样。

    2、C++继承权限和继承方式

    public、protected、private 指定继承方式
    不同的继承方式会影响基类成员在派生类中的访问权限

    1. public继承方式
    • 基类中所有 public 成员在派生类中为 public 属性;
    • 基类中所有 protected 成员在派生类中为 protected 属性;
    • 基类中所有 private 成员在派生类中不能使用。
    1. protected继承方式
    • 基类中的所有 public 成员在派生类中为 protected 属性;
    • 基类中的所有 protected 成员在派生类中为 protected 属性;
    • 基类中的所有 private 成员在派生类中不能使用。
    1. private继承方式
    • 基类中的所有 public 成员在派生类中均为 private 属性;
    • 基类中的所有 protected 成员在派生类中均为 private 属性;
    • 基类中的所有 private 成员在派生类中不能使用。
      在这里插入图片描述
    • 由于 private 和 protected 继承方式会改变基类成员在派生类中的访问权限,导致继承关系复杂,所以实际开发中我们一般使用 public。
    • 改变访问权限
      using 关键字可以改变基类成员在派生类中的访问权限,例如将 public 改为 private、将 protected 改为 public。

    3、C++继承时的名字遮蔽

    如果派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,那么就会遮蔽从基类继承过来的成员。所谓遮蔽,就是在派生类中使用该成员(包括在定义派生类时使用,也包括通过派生类对象访问该成员)时,实际上使用的是派生类新增的成员,而不是从基类继承来的。

    • 基类成员函数和派生类成员函数不构成重载
      基类成员和派生类成员的名字一样时会造成遮蔽,这句话对于成员变量很好理解,对于成员函数要引起注意,不管函数的参数如何,只要名字一样就会造成遮蔽。换句话说,基类成员函数和派生类成员函数不会构成重载,如果派生类有同名函数,那么就会遮蔽基类中的所有同名函数,不管它们的参数是否一样。

    4、C++派生类构造函数

    • 基类的成员函数可以被继承,可以通过派生类的对象访问;
    • 类的构造函数不能被继承。
    • 在派生类的构造函数中调用基类的构造函数。
    Student::Student(char *name, int age, float score): People("小明", 16), m_score(score){ }
    
    • 派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。
    • 通过派生类创建对象时必须要调用基类的构造函数,这是语法规定。 换句话说,定义派生类构造函数时最好指明基类构造函数;如果不指明,就调用基类的默认构造函数(不带参数的构造函数);如果没有默认构造函数,那么编译失败。

    5、派生类的析构函数

    • 和构造函数类似,析构函数也不能被继承。(不用程序员显示调用、编译器负责)
    • 外析构函数的执行顺序和构造函数的执行顺序也刚好相反。
      • 创建派生类对象时,构造函数的执行顺序和继承顺序相同,即先执行基类构造函数,再执行派生类构造函数。
      • 而销毁派生类对象时,析构函数的执行顺序和继承顺序相反,即先执行派生类析构函数,再执行基类析构函数。

    6、C++虚继承和虚基类

    • 多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。(容易产生问题,命名冲突。)
    • 虚继承(Virtual Inheritance)
      为了解决多继承时的命名冲突和冗余数据问题,C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员。在继承方式前面加上 virtual 关键字就是虚继承
    //间接基类A
    class A{
    protected:
        int m_a;
    };
    //直接基类B
    class B: virtual public A{  //虚继承
    protected:
        int m_b;
    };
    
    • 虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class)

    7、C++虚继承时的构造函数

    • 虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。
    • 这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。
    D::D(int a, int b, int c, int d): A(a), B(90, b), C(100, c), m_d(d){ }
    void D::display(){
        cout<<"m_a="<<m_a<<", m_b="<<m_b<<", m_c="<<m_c<<", m_d="<<m_d<<endl;
    }
    
    • 例子:
      • 在最终派生类 D 的构造函数中,除了调用 B 和 C 的构造函数,还调用了 A 的构造函数,这说明 D 不但要负责初始化直接基类 B 和 C,还要负责初始化间接基类 A。
      • 而在以往的普通继承中,派生类的构造函数只负责初始化它的直接基类,再由直接基类的构造函数初始化间接基类
    展开全文
  • 实验五:派生类和继承(二).doc
  • 【Java】继承和派生

    2022-03-23 20:43:51
    如果想声明一个类继承另一个,需要使用extends关键字 例子: public class A {} public class B extends A{} 构造顺序 子类的构造顺序:编译器会一直上溯到最初,执行该构造方法,然后依次执行各子类构造...
  • C继承和派生类PPT课件.pptx
  • 继承和派生类PPT学习教案.pptx
  • 分别声明Teacher(教师)类和Cadre(干部),采用多重继承方式由这两个类派生出新Teacher_Cadre(教师兼干部)。要求:①在两个基类中都包含一部分相同名字的数据成员name(姓名),age(年龄)成员函数...
  • C++继承派生

    千次阅读 2022-04-04 14:45:37
    1.继承派生:保持已有的特征构造新的过程为继承,在已有的基础上新增特性而产生新的过程称为派生 2.继承目的:实现代码重用;派生目的:实现源程序的改造 3.声明:class 派生类继承方式 基类 4.派生类:...
  • protected 与 public private 一样是用来声明成员的访问权限的。由protected声明的成员...在定义一个派生类时将基类的继承方式指定为protected的,称为保护继承,用保护继承方式建立的派生类称为保护派生类(protec
  • C继承和派生类PPT学习教案.pptx
  • 继承派生 ;基类和派生类 ;基类和派生类;基类和派生类;基类和派生类;基类和派生类;基类和派生类;基类和派生类;基类和派生类;基类和派生类;单继承 ;单继承;单继承;单继承;单继承;单继承;单继承;单继承;单继承;单...
  • C++实验三继承和派生类附答案.doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 245,139
精华内容 98,055
关键字:

类的继承和派生