继承与派生

  1. 所谓继承就是从先辈处得到属性和行为特征。专业的说就是在已有类的基础上创建新的类,新类可以从一个或多个已有类中继承成员函数和数据成员,而且重新定义或加进新的数据和函数,从而引成类的层次或等级。其中,已有类称为基类或父类,在他基础上建立的类称为派生类或子类。这里写图片描述
    上图是简单的学生分类图
    下面通过一个例子说明为什么要使用继承。
    现在有一个学生类 Student, 它含有 number, name, score 等数据成员与成员函数 print( ), 代码如下:
class Student
{
public:
    void print()
    {
        cout<<"number:"<<number<<endl;
        cout<<"name:"<<name<<endl;
        cout<<"score:"<<score<<endl;
    }
protected:
    int number;
    string name;
    float score;
};

假设现在要申明一个大学生类 UStudent,它含有 number, name, score, major 等数据和成员函数 print1(),代码如下:

class UStudent
{
public:
    void print1()
    {
        cout<<"number:"<<number<<endl;//此行在Student类中已存在
        cout<<"name:"<<name<<endl;//此行在Student类中已存在
        cout<<"score:"<<score<<endl;//此行在Student类中已存在
        cout<<"major:"<<major<<endl;//此行在Student类中 不 存在
    }
protected:
    int number;//此行在Student类中已存在
    string name;//此行在Student类中已存在
    float score;//此行在Student类中已存在
    string major;//此行在Student类中 不 存在
};

我们发现Student类和UsStudent类中有有许多相同的地方,像这样两个类,代码严重重复, 为提高代码的可重用性,可以引入继承,将UStudent类说明成Student类的派生类,那些相同的成员就不必在UsStudent类中说明了。代码如下:

class Student
{
public:
    void print()
    {
        cout<<"number:"<<number<<endl;
        cout<<"name:"<<name<<endl;
        cout<<"score:"<<score<<endl;
    }
protected:
    int number;
    string name;
    float score;
};
class UStudent:public Student
{
public:
    void print1()//新的成员函数
    {
        print();
        cout<<"major:"<<major<<endl;
    }
protected:
    string major;//新增加的数据成员
};

2.基类成员在派生类中的访问属性:
这里写图片描述
3. 1派生类的构造函数和析构函数
3.1.1派生类构造函数和析构函数的调用规则
通常情况下,当创建派生类对象时,首先调用积累的构造函数,随后再调用派生类的构造函数,当撤销派生类对象时,则先调用派生类的析构函数,随后再调用基类的构造函数。
3.2派生类构造函数和析构函数的构造规则
3.2.1简单的派生类的构造函数和析构函数
当基类的构造函数没有参数,或没有显示定义构造函数时,派生类可以不向基类传递,甚至可以不定义构造函数。派生类不能继承基类中的构造函数和析构函数。当基类含有带参数的构造函数时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。代码解析:

#include<iostream>
#include<stdlib.h>
using namespace std;
class B                 //申明基类B
{
public:
    B(int n)            //基类的构造函数
    {
        cout<<"Constructing B class"<<endl;
        i = n;
    }
    ~B()               //基类的析构函数
    {
        cout<<"Destructing B class"<<endl;
    }
    void dispi()
    {
        cout<<i<<endl;
    }
private:
    int i;
};

class D:public B        //申明基类B的公有派生类D
{
public:
    D(int n, int m)      //定义派生类构造函数时,
        :B(m)           //缀上要调用的基类构造函数及其参数
    {
        cout<<"Constructing D class"<<endl;
        j = n;
    }
    ~D()               //派生类的析构函数
    {
        cout<<"Destructing D class"<<endl;
    }
    void dispj()
    {
        cout<<j<<endl;
    }
private:
    int j;
};
void Funtest()
{
    D obj(50,60);
    obj.dispi();
    obj.dispj();
}
int main()
{
    Funtest();
    system("pause");
    return 0;
}

结果如下:
这里写图片描述
未写完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值