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

相关文章

来自专栏大内老A

“协变”、“逆变”与Delegate类型转换

我在发表了《Delegate如何进行类型转换?》之后又想到了其他一些相关的东西,除了简单地分析如何通过Emit实现EventHandler的类型转换之外,还加上...

2117
来自专栏Java Edge

Java语法糖1 泛型与类型擦除

3427
来自专栏angularejs学习篇

关于c#中委托使用小结

  委托对与我们编程人员来说,一点都不陌生,在实际工作过程中,或多或少都应该是接触过

831
来自专栏技术小黑屋

Java细节:字符串的拼接

工作日忙于项目的逻辑实现,周六有点时间,从书柜里拿出厚厚的英文版Thinking In Java,读到了字符串对象的拼接。参考着这本书做个翻译,加上自己思考的东...

722
来自专栏MyBlog

Effective.Java 读书笔记(4)非实例化

有时你想要编写一个类,这个类只是静态方法和静态域的组成,这样的一个类获得一个糟糕的名声因为一些人滥用他们为了避免对对象的术语进行思考,但是他们的确是有用的

602
来自专栏Kevin-ZhangCG

[ Java面试题 ]泛型篇

1825
来自专栏Golang语言社区

map按key和按value排序

看一个题: 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 例示: jack 70...

3678
来自专栏前端杂货铺

异步Promise实现

简介    异步回调的书写往往打乱了正常流的书写方式,在ECMAScript 6中实现了标准的Promise API,旨在 解决控制回调流程的问题。   简单的...

34110
来自专栏IMWeb前端团队

简单的实现Javascript的MVC

最近看了一篇文章,“30行代码实现Javascript中的MVC”,原文链接:http://www.jqsite.com/notes/1603205925.ht...

3477
来自专栏小勇DW3

java设计模式之模板模式以及钩子方法使用

  模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台。当不可变和可变的方法在子类中混合在一起的时候,

824

扫码关注云+社区