首页 > 其他分享 >继承与派生(一)

继承与派生(一)

时间:2024-04-01 13:29:22浏览次数:12  
标签:cout 派生 继承 成员 基类 公用 stud 派生类

1 继承与派生的概念

面向对象技术强调软件的可重用性。在C++中可重用性是通过“继承”这一机制来实现的。因此,继承是C++的一重要组成部分。

前面介绍了类,一个类中包含了若干数据成员和成员函数。每一个类的数据成员和成员函数是不相同的。但有时两个类的内容基本相同或有一部分相同。例如前面我们声明了学生基本数据的类stud:

class stud

{private; 

int num;

char name[10];

char sex; 

public;

void display ( ) //对成员函数 display的定义

{cout<<"num:"<<hum<<endl;

cout<<"name: "<<name<<endl;

cout<<*sex: "<<sex<<endl;}

}:

如果学校的某部门除了需要用到学号、姓名、性别以外,还需要用到年龄、地址等信息,当然可以重新声明另一个类:

class stud 1

{private:

int num; //此行原来已有

char name[10]; //此行原来已有

char sex; //此行原来已有

int age;

char addr[20];

public:

void display(): //此行原来已有

{cout<<"num:"<<num<<endl; //此行原来已有

cout<<"name:"<<name<<endl; //此行原来已有

cout<<"sex:"<<sex<<endl; //此行原来己有

cout<<"age:"<<age<<endl;

cout<<"address:"<<addr<<endl;}

};

可以看到有相当一部分是原来已有的。很多人自然会想到能否利用原有声明的类作为基础,再加上新的内容即可,以减少重复的工作量。C+十提供的“继承”机制就是为了解决这个问题。

先举一个日常生活中的例子来说明此问题。如果已经定义了“马”的特征,现在需要说明什么是“公马”,只需在“马”的特征的基础上增加“雄性”这一特征即可,不必从头说明什么是马。如果想进一步说明什么是“白色的公马”,只需在“公马”的基础上再增加说明“颜色是白的”即可。也就是说:“公马”继承了“马”的全部特征,加上“雄性”的新特征。“白公马”继承了“公马”的全部特征,再增加“白色”的特征。而“公马”是“马”派生出来的一个分支,“白公马”是“公马”派生出来的一个分支。见图15.4示意。

在C++中所谓“继承”就是在一个已存在的类的基础上建立一个新的类。已存在的类(好比“马”)称为“基类”或“父类”。新建立的类称为“派生类”或“子类”。见图15.5示意。派生类继承了基类的所有数据成员和成员函数,并增加新的成员。

2 建立派生类的方法

先通过一个例子说明怎样通过继承来建立派生类。

例15.4通过继承来建立派生类。

假设已经声明了一个基类stud(见前面的介绍),在此基础上声明一个派生类

student:

class student: public stud //声明基类是stud

{

private:

int age; //新增加的数据成员

char addr[30]; //新增加的数据成员

public:

void display_1() //新增加的成员函数

{cout<<"age:"<<age<<endI;

cout<<"address:"<<addr<<endl;}

};

仔细观察第一行:

class student: public stud

在class 后面的student是新建的类名。冒号后面的stud表示是已存在的基类。在stud之前有一关键字public,用来表示基类stud 中的成员在派生类student中的使用权限。基类名前面有public 的称为“公用派生类”。其含义将在稍后讨论。

请读者仔细阅读以上声明的派生类student和上一节中给出的基类stud,并将它们放在一起进行分析。

定义派生类的一般形式为

class 派生类名:[引用权限]基类名

{

派生类新增加的数据成员

派生类新增加的成员函数

};

“引用权限”可以是private(私有的)和public(公用的)。引用权限可以不写,此时系统默认它为private。

派生类包括基类成员和自己增加的成员,派生类的成员函数在引用派生类自己的数据成员时,按前面介绍过的规则处理(即私有数据成员只能被同一类中的成员函数引用,公用成员可以被外界引用),而对从基类继承来的成员的引用并不是简单地把基类的私有成员和公用成员直接作为派生类的私有成员和公用成员,而要根据基类成员的引用权限和派生类声明的引用权限共同决定。下面将分别介绍。

3公用派生类

在声明一个派生类时将基类的引用权限指定为public的,该类称为基类的公用派生类。

在公用派生类中,基类的公用成员和保护(protected)成员仍然成为派生类中的公用成员和保护成员,而基类的私有成员不能被派生类引用,即成为派生类“不可访问的成员”,只有基类的成员函数可以引用它。基类的成员在公用派生类中的引用权限见表15.1。

                                                表15.1公用派生类的继承关系

基类

私有成员

公共成员

公用派生类

不可访问的成员

公共成员

例15.5访问基类成员。

class stud //声明基类

{private : //基类私有成员

int num;

char name[10];

char sex;

public: //基类公用成员

void display ( )

{cout<<"num: "<<num<<endl;

cout<<"name:"<<name<<endl;

cout<<"sex:"<<sex<<endl;}

};

class student: public stud //声明一个公用派生类

private:

int age;

char addr[30];

public:

void show( )

{ cout<<"num; "<<num<<endl; //企图引用基类的私有成员,错误。

cout<<"name: "<<name<<endl; //企图引用基类的私有成员,错误。

cout<<"sex; "<<sex<<endl; //企图引用基类的私有成员,错误。

cout<<"age; "<<age<<endl; //引用派生类的私有成员,正确。

cout<<"address:"<<addr<<endl) //引用派生类的私有成员,正确。

由于基类的私有成员对派生类来说是不可访问的,因此在派生类中的show函数中直接引用基类的私有数据成员num ,name和sex是不允许的。可以通过基类的公用成员函数来引用基类的私有数据成员。上面对派生类student的声明可改为

class student : public stud //声明一个公用派生类

{

private:

int age;

char addr[20];

public:

void show ( )

{display(); //引用基类的公用成员函数,允许,

cout<<"age:"<<age<<endI: //引用派生类的私有成员,正确。

cour<<"address: "<<addr<<endl;) //引用派生类的私有成员,正确。

};

在派生类成员函数show中引用基类的公用成员函数display,通过display引用基类 stud 中的私有数据 num,name 和sex。可以这样写main函数(假设对象a中已有数据}:

void mam ()

{student a: //定义一个student派生类的对象a

...

a. show(); //输出a对象的5个数据

请分析在主函数中能否出现以下语句:

n. display(); //正确。从基类继承的公用成员函数

a. age=18; //错误。外界不能引用派生类的私有成员

a.num=10020; //错误。外界不能引用基类的私有成员

标签:cout,派生,继承,成员,基类,公用,stud,派生类
From: https://blog.csdn.net/office_lgirl/article/details/137116593

相关文章

  • 继承与派生(二)
    4私有派生类在声明一个派生类时,将基类的引用权限指定为private的,该类称为基类的私有派生类。在私有派生类中,基类的公用成员和保护成员成为派生类中的私有成员,基类的私有成员成为派生类“不可访问的成员”,只有基类的成员函数可以引用它。基类的成员在私有派生类中的引用......
  • 【前端面试3+1】06继承方式及优缺点、缓存策略、url输入到渲染全过程、【二叉树中序遍
    一、继承有哪些方式?以及优缺点        继承的方式包括原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承和组合式继承。1.原型链继承:实现方式:将子类的原型指向父类的实例来实现继承。优点:简单易懂,代码量少。缺点:存在引用类型共享的问题。functionPare......
  • CSS继承性-行高的继承性
    CSS中行高的继承性是CSS继承特性中的一个具体表现。简单来说,如果一个元素(父元素)设置了行高(line-height),那么它的子元素会继承这个行高值,除非子元素本身也设置了行高。行高的继承性有助于保持文本在父子元素之间的一致性和可读性。例如,如果父元素的行高设置为1.5(这通常是相对于......
  • Java继承<一>
    目录继承作用继承概念继承语法访问父类成员变量1.子类和父类不存在同名成员变量2.子类和父类成员变量同名访问父类成员方法1.成员方法名字不同2.成员方法名字相同super关键字继承作用Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以......
  • 菱形继承与虚基类
    菱形继承会存在多份数据的问题,使用虚继承解决问题虚基类指针vbptr#include<iostream>classAnimal{public:intm_Age;};classSheep:virtualpublicAnimal{public:Sheep(){std::cout<<"sheep"<<std::endl;};};classTu......
  • 继承之同名成员的处理
    #include<iostream>classBase{public:Base(){m_A=100;}voidfunc(){std::cout<<"basefunc"<<std::endl;};intm_A;};classSon:publicBase{public:Son(){m_A=200;......
  • WPF中继承ItemsControl子类控件数据模板获取选中属性
    需求场景列表类控件,如ListBox、ListView、DataGrid等。显示的行数据中,部分内容依靠选中时触发控制,例如选中行时行记录复选,部分列内容控制显隐。案例源码以ListView为例。Xaml部分<ListViewItemsSource="{BindingMyPropertys}"IsManipulationEnabled="False"><List......
  • C++类继承基础5——继承中的类作用域
    继承中的类作用域每个类定义自己的作用域,在这个作用域内我们定义类的成员。当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内。如果一个名字在派生类的作用城内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义。派生类的作用域位于基类作用域之内......
  • 继承特点、访问特点、方法重写1
    1.继承的特点:①子类可以继承父类的属性和行为,但是子类不能继承父类的构造器;  //子类有自己的构造器,父类构造器用于初始化父类的对象②java是单继承模式,一个类只能继承一个直接父亲;③java不支持多继承、但是支持多层继承;④java所有的的类都是Object的子类;//Java中的所......
  • 深入解析Java继承机制:面向对象编程的核心探究【Java面试题】
    作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共同成长。请大家以开放的心态阅读,相信你们也会在这段知识之......