继承与派生

来源:互联网 发布:电子音乐制作软件ios 编辑:程序博客网 时间:2024/06/03 03:49
  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
原创粉丝点击