zoukankan      html  css  js  c++  java
  • 类的继承与派生

    继承与派生

    在教材中给出的对类的继承和派生的解释:
    “类的继承,是新的类从已有类那里得到已有的特性。”
    “从已有的类产生新类的过程就是类的派生。”
    新的类是基类的派生类,新的类从基类处得到已有的特性。

    一、继承与派生举例

    新的类是基类的派生类,新的类从基类处得到已有的特性。
    例1、写一个类student,再写一个Student类的派生类Undergraduate。
    代码:

    #define _CRT_SECURE_NOWARNINGS
    #include<iostream>
    #include<string>
    using namespace std;
    class Student
    {
    public:
     Student()
     {
      name = "abcd";
      old = 0;
     }
     Student(string String1,int years)
     {
      name = String1;
      old = years;
     }
     void SetNO(string String1, int years)
     {
       name = String1;
       old = years;
     }
     string Getname()
     {
      return name;
     }
     int Getold()
     {
      return old;
     }
    private:
     string name;
     int old;
    };
    class Undergrauate : public Student
    {
    public:
     Undergrauate()
     {
      school = "xx大学";
      major = "xx专业";
     }
     Undergrauate(string S,string M,string N,int O)
     {
      school = S;
      major = M;
      SetNO(N, O);
     }
     string Getschool()
     {
      return school;
     }
     string Getmajor()
     {
      return major;
     }
    private:
     string school;
     string major;
    };
    int main()
    {
     Undergrauate student1("西南石油大学","计算机科学与技术专业","海绵宝宝",18);
     cout << "姓名:" << student1.Getname() << endl;
     cout << "年龄:" << student1.Getold() << endl;
     cout << "学校:" << student1.Getschool() << endl;
     cout << "专业:" << student1.Getmajor() << endl;
     system("pause");
     return 0;
    }
    

    运行截图:
    在这里插入图片描述
    Student类从Undergraduate类继承了Undergraduate类的public成员,如成员函数Getname和成员函数Getold,在Student类中可以直接访问Undergraduate类的公有成员,在类外可以通过Student类访问Undergraduate类的公有成员。
    在这里,Student类是Undergraduate类的派生类,Undergraduate类是Student类的基类。

    二、类的继承方式(访问控制)

    1、公有继承
    “当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可访问。”
    2、私有继承
    “当类的继承方式为私有继承时,基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而基类的私有成员在派生类中不可直接访问。”
    3、保护继承
    “保护继承中,基类的公有成员和保护成员都以保护成员的身份出现在派生类中,而基类的私有成员不可直接访问。”

    例2、在例题1的基础上,规定继承方式为私有继承,并在设法验证该继承方式的特性。

    在例题1代码的基础上,将继承方式修改为题目指定的私有继承。

    在这里插入图片描述

    编译器报错,不可再访问派生类从基类继承的基类中的公有函数,因为继承方式为私有继承,派生类继承的基类的公有成员和保护成员再派生类中的属性变为私有,固无法直接访问。

    在这里插入图片描述

    解决方法:由于私有成员不可直接访问,但可以通过成员函数去访问。在Student类中写两个函数,分别再在这两个函数中调用继承的Getname函数和Getold函数。然后在主函数中调用这两个新写的函数即可得到对象的成员name和成员old的值。
    实验代码

    #define _CRT_SECURE_NOWARNINGS
    #include<iostream>
    #include<string>
    using namespace std;
    class Student
    {
    public:
     Student()
     {
      name = "abcd";
      old = 0;
     }
     Student(string String1,int years)
     {
      name = String1;
      old = years;
     }
     void SetNO(string String1, int years)
     {
       name = String1;
       old = years;
     }
     string Getname()
     {
      return name;
     }
     int Getold()
     {
      return old;
     }
    private:
     string name;
     int old;
    };
    class Undergrauate : private Student
    {
    public:
     Undergrauate()
     {
      school = "xx大学";
      major = "xx专业";
     }
     Undergrauate(string S,string M,string N,int O)
     {
      school = S;
      major = M;
      SetNO(N, O);
     }
     string Getschool()
     {
      return school;
     }
     string Getmajor()
     {
      return major;
     }
     string GetName()
     {
      return Getname();
     }
     int GetOld()
     {
      return Getold();
     }
    private:
     string school;
     string major;
    };
    int main()
    {
     Undergrauate student1("西南石油大学","计算机科学与技术专业","海绵宝宝",18);
     cout << "姓名:" << student1.GetName() << endl;
     cout << "年龄:" << student1.GetOld() << endl;
     cout << "学校:" << student1.Getschool() << endl;
     cout << "专业:" << student1.Getmajor() << endl;
     system("pause");
     return 0;
    }
    

    运行截图:
    在这里插入图片描述
    总结:继承方式是怎样的,基类的公有成员和保护成员的属性在派生类中同继承的方式一样(公有继承除外,在公有继承中,基类的成员继承到派生类中时其属性不变),且无论继承方式是什么,派生类都不可直接访问基类的私有成员。

  • 相关阅读:
    POJ 3080 Blue Jeans
    POJ 1961 Period
    POJ 2185 Milking Grid
    POJ 2752 Seek the Name, Seek the Fame
    斗地主算法的设计与实现--项目介绍&如何定义和构造一张牌
    MyEclipse 免安装版制作
    网络子系统48_ip协议数据帧的发送
    Oracle sql语句执行顺序
    当OOP语言RAII特性发展到functional形式的极致
    FusionCharts属性大全
  • 原文地址:https://www.cnblogs.com/TracerLyh/p/11659979.html
Copyright © 2011-2022 走看看