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

相关文章

来自专栏GreenLeaves

Array对象的判定

/* 关于JS对象类型的判断,最复杂的在于RegExp和Array了,判定RegExp的情形不较少,而Array就比较多了,下面就是判断Array的...

1685
来自专栏肖洒的博客

继承和多态

这里继承和多态的概念与java的概念差不多。概念还是需要多次理解才能透彻。感觉类和实例的概念还是不能深刻理解。再次复习下吧。

483
来自专栏我和PYTHON有个约会

27. 企业级开发基础8:面向对象扩展

前面的章节中,我们已经学习过面向对象的基本操作、面向对象的三大特征的详细操作,对于面向对象有了一个初步的了解和认知。 本节内容会针对面向对象的程序设计进行一部...

582
来自专栏python百例

86-OOP之子类调用父类方法

如果子类和父类具有同名的方法,那么父类方法将被遮盖住。 可以在子类中明确指明调用的是父类方法,而不是子类的同名方法。

622
来自专栏IMWeb前端团队

这些Zepto中实用的方法集

前言 时间过得可真快,转眼间2017年已去大半有余,你就说吓不吓人,这一年你成长了多少,是否荒度了很多时光,亦或者天天向上,收获满满。今天主要写一些看Zept...

2068
来自专栏技术专栏

Python3入门与实践(四): 面向对象

==当通过 student.name获取变量值的时候,首先会查找实例变量里有没有name属性,如果有则返回,如果没有就会去类变量里找,如果还是没有则会报错==

692
来自专栏hbbliyong

C++虚析构函数解析

 当派生类对象从内存中撤销时一般先运行派生类的析构函数,然后再调用基类的析构函数。 如果用new运算符建立的派生类的临时对象,对指向基类的指针指向这个临时对...

3377
来自专栏我爱编程

Day9面向对象编程2/2

继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class...

2644
来自专栏python3

python 面向对象之静态方法

通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过...

542
来自专栏Python

python ——面向对象进阶

1.staticmethod和classmethod staticmethod  静态方法: 让类里的方法,直接被类调用,就像正常的函数一样 宝宝,男 博博,女...

1807

扫码关注云+社区