C++ 类的继承与派生

继承性是面向对象程序设计最重要的特性之一,使软件有了可重用性,C++提供的类的继承机制。

继承与派生的概念

一个新类从已有的类那里获得已有的特性,这种现象称为类的继承。同样也可以说成已有的类派生出来了新的类。类A继承自类B也就是类B派生了类A。所以继承和派生的关系就像小学时把字句和被字句的造句一样。有了继承与派生后,就有了父类/基类与子类/派生类,C++中将类B称为父类/基类,将类A称为子类/派生类。 派生类的声明:

#include <iostream>

using namespace std;

class Student   //基类的声明
{
public:
    Student()
    {
        num = 1;
        name = 'Z';
        sex = 'm';
    }
    void myshow()
    {
        cout<<"num:"<<num<<endl<<"name:"<<name<<endl<<"sex:"<<sex<<endl;
    }
private:
    int num;
    char name;
    char sex;
};
class Student1:public Student //派生类的声明
{
public:
    Student1()
    {
      age = 16;
    }
    void myshow1()
    {
      myshow();
      cout<<"age:"<<age<<endl;
    }
private:
    int age;
};
int main()
{
    Student stu;
    stu.myshow();
    Student1 stu1;
    stu1.myshow1();
    getchar();
    return 0;
}

运行结果: num:1 name:Z sex:m age:16 num:1 name:Z sex:m

从上述代码中,可以看出类的继承的形式与特性: 1.类的继承以class Student1:public Student{} 的形式,Student是基类,Student1是派生类,继承方式为public(公用继承)。 2.派生类需要把基类的全部成员(不包括构造函数与析构函数)接收过来,不能只接受一部分。 3.类的继承方式包括:public(公用继承),private(私有继承),protected(受保护的),而不同的继承方式将影响派生类成员的访问属性。

公用继承

如果采用公用继承,基类中的访问属性在派生类中保持不变,即: 基类中的私有属性——派生类中私有属性 基类中的共用属性——派生类中共用属性 基类中的受保护属性——派生类中受保护属性

class Student   //基类的声明
{
public:
    Student()
    {
        num = 1;
        name = 'Z';
        sex = 'm';
    }
    void myshow()
    {
        cout<<"num:"<<num<<endl<<"name:"<<name<<endl<<"sex:"<<sex<<endl;
    }
private:
    int num;
    char name;
    char sex;
};
class Student1:public Student //派生类的声明
{
public:
    Student1()
    {
      age = 16;
    }
    void myshow1()
    {
      myshow();
      cout<<"age:"<<age<<endl;
    }
private:
    int age;
};

在这个例子中,派生类Student1中的私有成员为:

    int num;
    char name;
    char sex;
    int age;

共有成员为:

    myshow();
    myshow1();

私有继承

如果采用私有继承,基类中的访问属性在派生类中发生如下变化,即: 基类中的私有属性——派生类中不可访问 基类中的共用属性——派生类中私有属性 基类中的受保护属性——派生类中私有属性

class Student   //基类的声明
{
public:
    Student()
    {
        num = 1;
        name = 'Z';
        sex = 'm';
    }
    void myshow()
    {
        cout<<"num:"<<num<<endl<<"name:"<<name<<endl<<"sex:"<<sex<<endl;
    }
private:
    int num;
    char name;
    char sex;
};
class Student1:private Student //派生类的声明
{
public:
    Student1()
    {
      age = 16;
    }
    void myshow1()
    {
      myshow();
      cout<<"age:"<<age<<endl;
    }
private:
    int age;
};

在这个例子中,派生类Student1中的私有成员为:

    int age;//子类新增
    myshow();//继承自父类

共有成员为:

    myshow1(); //子类新增

子类不可访问:

    int num;
    char name;
    char sex;

保护继承

受保护的成员不能被类外访问,这一点类似私有成员,可以认为保护尘缘对类的用户来说是私有的。但是有一点与私有成员不同:受保护成员可以被派生类的成员函数引用。

如果采用保护继承,基类中的访问属性在派生类中发生如下变化,即: 基类中的私有属性——派生类中不可访问 基类中的共用属性——派生类中受保护属性 基类中的受保护属性——派生类中受保护属性

class Student
{
public:
    Student()
    {
        num = 1;
        name = 'Z';
        sex = 'm';
    }
 protected:
    void myshow()
    {
        cout<<"num:"<<num<<endl<<"name:"<<name<<endl<<"sex:"<<sex<<endl;
    }
private:
    int num;
    char name;
    char sex;
};
class Student1:protected Student
{
public:
    Student1()
    {
        age = 16;
    }
    void myshow1()
    {
        cout<<"age:"<<age<<endl;
    }
private:
    int age;
};

如以上例子所示(当然这个例子没有什么意义,一个类数据私有,函数受保护就没有与外界的接口了,在这里仅仅作为例子

在这个例子中,派生类Student1中的私有成员为:

    int age;

共有成员为:

    myshow1(); 

受保护成员为:

    myshow(); 

子类不可访问:

    int num;
    char name;
    char sex;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenCV 实现SSIM结构相似性算法

    SSIM算法的介绍: http://blog.csdn.net/chaipp0607/article/details/70158835 代码做了一下处理: ...

    chaibubble
  • C++ 动态捕获整型数列

    假设有这样一个要求,输入两列数字,第一行是数组中数字的个数,第二行数数组中的数字,中间以空格隔开,我们可以写出这样的一段代码: int num; ...

    chaibubble
  • Python 使用@property

    首先是动态更新功能,类内加了@property装饰器的函数具备动态更新功能,类似于一种回调函数,只要函数内涉及的变量有变化,该函数就会执行回调,动态更新。 也...

    chaibubble
  • Python 数据结构 tree 树

    除了已经存在name, child, parent属性外,我们可以自定义其他属性方便操作。

    py3study
  • 虚拟机篇 之「垃圾收集与内存分配策略」

    在 Java 对象被回收之前,首先需要判断该对象是否已经过期或者死亡?常见的判断一个对象是否过期的算法主要有两种,分别为:

    CG国斌
  • 10款软件的正式激活码!!

    用户1272546
  • [Leetcode][python]Sudoku Solver/解数独

    上一题hashtable的解法效率很高,想挪过来判断,但始终没修改成功,以后有空改好它,在这里做备份。

    后端技术漫谈
  • Python批量判断IP地址所属地区

    首先安装Python扩展库netaddr,然后对下面的代码进行简单修改后即可满足某些场合的应用。 from random import randrange fr...

    Python小屋屋主
  • 行业人士需要了解开放计算项目的误区

    日前,数据中心硬件提供商超大规模IT主管詹姆斯·贝利澄清了一些企业持有开放计算项目的误区和神话。 市场分析机构Gartner公司预计整体公共云市场将增长16.5...

    静一
  • iOS开发进阶篇——FRP与ReactiveCocoa的介绍(一)

    *****阅读完此文,大约需要30分钟***** 本篇章主要以介绍FRP以及RAC的信号相关概念为主。 一、FRP的概念 RAC(ReactiveCocoa)是...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券