首页 > 代码库 > 面向对象的另一大特性《继承》

面向对象的另一大特性《继承》

C++是一门面向对象的编程语言,而面向对象的三大特性分别是   封装、继承、多态

今天就来谈谈面向对象中的另一个特性--------继承


继承和现实中的继承类似,在现实生活中儿子会具备父亲的一些特征,而且可能会继承父亲的财产

儿子与父亲的关系图如下图所示


在编程中将父亲定义为基类(或者定义为父类),儿子定义为子类,而C++中就是用继承来表示这种基类与子类的关系


我再用一个与程序员息息相关的例子来描述继承


然后通过代码进一步理解继承,我在前面的博客中写过一个Student类,这次将通过学生类派生出一个Student1类

Student类的实现代码可以参考http://blog.csdn.net/u010105970/article/details/25637493


在使用继承前Student类的代码

#include <iostream>
#include <String>

using namespace std;

class Student//定义一个Student类
{
public:
    //构造函数
    Student(int n, string nam, char s)
    {
        num = n;
        name = nam;
        sex = s;
    }

    //显示学生信息
    void show()
    {
        cout<<"num = "<<num<<endl;
        cout<<"name = "<<name<<endl;
        cout<<"sex = "<<sex<<endl<<endl;
    }

//数据成员的类型为保护类型
protected:
    int num;//学号
    string name;//姓名
    char sex;//性别
};

void main()
{
    //定义一个Student的对象stud1
     Student stud1(20010, "Hexing", 'm');

     //stud1调用成员函数show()实现学生信息的输出
     stud1.show();

    system("pause");
}

程序执行结果


Student1继承Student后的代码

#include <iostream>
#include <String>

using namespace std;

class Student//定义一个Student类
{
public:
    //构造函数
    Student(int n, string nam, char s)
    {
        num = n;
        name = nam;
        sex = s;
    }

    //显示学生信息
    void show()
    {
        cout<<"num = "<<num<<endl;
        cout<<"name = "<<name<<endl;
        cout<<"sex = "<<sex<<endl<<endl;
    }

//数据成员的类型为保护类型
protected:
    int num;//学号
    string name;//姓名
    char sex;//性别
};

//Student1以公有继承(public)的方式继承Student
class Student1 : public Student
{
public:

    //构造函数中使用初始化表
    Student1(int n, string nam, char s, int a, string ad):
    Student(n, nam, s)
    {
        age = a;
        addr = ad;
    }

    //显示学生信息
     void show1()
    {
        cout<<"num = "<<num<<endl;
        cout<<"name = "<<name<<endl;
        cout<<"sex = "<<sex<<endl;
        cout<<"age = "<<age<<endl;
        cout<<"addr = "<<addr<<endl<<endl;
    }

//增加了新的数据成员
private:
    int age;//年龄
    string addr;//地址
};

void main()
{
    //定义一个Student1类的对象stud
    Student1 stud1(10010, "Wangli", 'f', 19, 
        "115 Beijing Road, Shanghai");

    //定义一个Student1类的对象stud2
     Student1 stud2(10011, "Zhangfun", 'm', 21, 
        "213 Shanghai Road, Beijing");

     //定义一个Student类的对象stud3
     Student stud3(20010, "Hexing", 'm');

     stud1.show1();//调用成员函数,显示学生信息
     stud2.show();//因为对象stud2的类继承自Student,所以stud2可以使用Student类的成员函数
     stud3.show();//调用成员函数,显示学生信息

    system("pause");
}


执行结果



说明:

上面的代码中父类Student派生出子类Student1,所以子类Student1继承了父类Student的全部属性

子类可以访问父类的数据成员和成员函数

而访问限制受到了继承方式和访问级别的影响


可以通过查看下面的表格查看继承方式和访问级别对访问成员的影响



面向对象的另一大特性《继承》