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 条评论
登录 后参与评论

相关文章

来自专栏社区的朋友们

深度学习入门实战(三):图片分类中的逻辑回归

上一讲我们介绍了一下线性回归如何通过TensorFlow训练,这一讲我们介绍下逻辑回归模型,一句话说概括,逻辑回归就是多分类问题。

4.9K10
来自专栏遊俠扎彪

如何让你的程序支持管道输入

其实很简单,管道是通过stdin和stdout来传给程序的。

29900
来自专栏开发与安全

从零开始学C++之模板(四):用模板实现单例模式(线程安全)、模板方式实现动态创建对象

一、用模板实现单例模式 在前面的文章中,用过多种方法实现单例模式,现在用模板方式来实现: 为了实现线程安全,需要在linux 下使用pthread_mutex_...

38800
来自专栏肖力涛的专栏

NLP 点滴 :文本相似度 (下)

在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性。

1.2K20
来自专栏Celebi的专栏

C/C++ 学习笔记五(结构体、字符与字符串)

工作中经常使用到C/C++,为对C有个比较深刻的了解,重新拾起学习C的任务。在看书的同时,记录下思考的过程,也记录下重要的知识点。

60400
来自专栏女程序员的日常

虚函数&多态

对于经常被问到的虚函数和多态的问题,发现百度百科回答得十分详细,所以自己在百度百科上的解释进行总结 一、虚函数 (1)虚函数简介:在某基类中声明为virtua...

24610
来自专栏况鹰的专栏

关于Android图片资源瘦身的奇思妙想

替换掉系统的压缩算法。如果你不嫌麻烦和喜欢折腾的话可以在你的apk使用一下,效果还是非常显著的。

2.7K40
来自专栏女程序员的日常

实现一个栈类,类似STL中的栈

1、思路讲解 stack集合类是一个简单的堆栈的实现。 这里有两个模板参数,T和size,T用于指定堆栈中的元素类型,my_size用于表示堆栈中项数的最大值。...

26610
来自专栏社区的朋友们

深入浅出 Nodejs( 三 ):Nodejs 核心模块机制

本篇教程关于Nodejs的核心模块机制,具体讲Nodejs核心模块的原理、C/C++扩展模块的原理、包、模块调用栈以及NPM。

1.3K00
来自专栏遊俠扎彪

C++ 的 Name Mangling

编程语言组织程序,都有一定的可见范围,比如Java的包、C/C++的文件。就像我们平时使用的文件夹一样,有了这些组织机制,变量、函数的命名在一定程度上就可以重复...

94900

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励