继承与派生

合集下载

继承与派生

继承与派生
在基类中的访问属性 private private private protected protected protected public public public 继承方式 private protected public private protected public private protected public 在派生类中的访问方式 不可直接访问 不可直接访问 不可直接访问 private protected protected private protected public 在派生类外的访问方式 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 public
4.1 继承和派生的概念
在软件开发过程中,在定义特殊类时,不需把它的一 般类已经定义过的属性和服务重复地书写一遍,只需要声 明它是某个类的特殊类,并定义它自己的特殊属性和服务。 这将明显地减轻开发工作的强度。 4.1.2 继承的作用 面向对象程序设计的继承性使得大型应用程序的维护 和设计变得更加简单。一方面,大型应用程序设计完成并 交付使用后,经常面临用户的需求发生变化,程序功能需 要扩充等问题。这时程序的修改需要非常谨慎,因为某个 局部的修改可能会影响其他部分,而一个正在使用中的系 统要进行全面的测试,既费时间又有很多实际的困难。另 一方面,一个新的应用系统程序设计在许多方面会和以前 设计过的某个或某些系统的模块非常类似,怎样加快大型 应用程序的开发速度,重用这些已经开发成功的程序模块, 一直是软件设计中迫切需要解决的问题。
4.2 派生类
C++语言派生类多重继承的定义格式如下: class <派生类名>:[继承方式1] [<基类名1>],[继承 方式2] [<基类名2>],…, [继承方式n] [<基类名n>] { <派生类成员变量和成员函数定义> }; 通常,在多重继承时,继承方式设计成一致的形式。 如继承方式均设计成public,或均设计成private。

7章_继承与派生

7章_继承与派生

例1 void main() class A{ { A a; protected: B b; int X; b.Function(); }; a.X=5; class B:public A b.X=7; { } public: 错误,水平访问时 void Function(); 保护成员相当于 }; 私有成员 void B::Function() { 正确,垂直访问时 X=5; 保护成员相当于 }
例(续2)
#include <iostream> using namespace std; void main( ) { Rectangle rect; rect.InitR(2,3,20,10); //水平访问 rect.Move(3,2); // 直接调用基类公有成员函数 cout<<rect.GetX()<<","<<rect.GetY()<<"," <<rect.GetH()<<", "<<rect.GetW()<<endl; } 输出: 5,5,10,20
公有成员
例7_1:分析下列程序中的访问权限
class Point { public: void InitP(int xx,int yy); void Move(int xOff,int yOff); int GetX() {return X;} int GetY() {return Y;} private: int X,Y; }; //基类声明结束 void Point::InitP(int xx,int yy) //函数成员实现 { X=xx; Y=yy; } void Point::Move(int xOff,int yOff) { X+=xOff; Y+=yOff; }

第七章 继承和派生

第七章 继承和派生

第七章继承和派生一、基类和派生类1. 在C++中,可以从一个类派生出另一个类,前者称为基类或父类,后者称为派生类或子类。

一个派生类可以从一个或多个基类派生。

从一个基类派生的继承称单继承,从多个基类派生的继承称多继承。

2. 单继承定义格式:class 派生类:继承方式基类{ 派生类新定义成员;};其中,“派生类”是从“基类”按指定的“继承关系”派生出的、新定义的一个类的名字。

“继承方式”有三种:(1)public 公有继承(2)private 私有继承(3) protected 保护继承3. 多继承定义格式:class 派生类:继承方式1 基类1,继承方式2 基类2,…{ 派生类新定义成员;};4. 公有继承:当派生类的继承方式是public继承时,基类的public和protected成员的访问属性在派生类中保持不变,而基类的private成员不可访问,即基类的public和protected成员分别作为派生类的public和protected成员,派生类的其他成员可以直接访问它们。

例1:class B{ private: int x; protected: int y; public: int z;…};class A:public B{ private: int a; protected: int b; public: int c;…}; A a;(1)类B是基类,有3个数据成员x、y、z,分别是private、protected、public属性。

类A是派生类,有3个数据成员a、b、c,分别是private、protected、public属性。

由于类A是从类B公有派生的,类B中的public、protected属性的成员可继承到类A中来,且保持原来的属性。

故类A中有5个数据成员,即a、b、c、y。

(2)可以通过类A的对象a直接访问public成员,即z和c,并不能访问a、b、y数据成员。

继承与派生

继承与派生

§5 派生类的构造函数和析构函数
构造函数的主要作用是对数据成员初始化, 构造函数的主要作用是对数据成员初始化, 所以在设计派生类的构造函数时,不仅要考 所以在设计派生类的构造函数时, 虑派生类所增加的数据成员的初始化, 虑派生类所增加的数据成员的初始化,还应 当考虑基类的数据成员的初始化。 当考虑基类的数据成员的初始化。在执行派 生类的构造函数时, 生类的构造函数时,调用基类的构造函数
一、简单的派生类的构造函数
1、概念 、 任何派生类都包含基类的成员, 任何派生类都包含基类的成员,简单的派生类只 有一个基类,而且只有一级派生(只有直接派生类 有一个基类,而且只有一级派生 只有直接派生类 没有间接派生类), ,没有间接派生类 ,在派生类的数据成员中不包 含基类的对象(即子对象 即子对象)。 含基类的对象 即子对象 。 2、其一般形式为: 、其一般形式为: 派生类构造函数名(总参数表列) 派生类构造函数名(总参数表列): 基类构造 函数名(参数表列) 函数名(参数表列) {派生类中新增数据成员初始化语句 派生类中新增数据成员初始化语句} 派生类中新增数据成员初始化语句
二、私有继承
2、私有基类在派生类中的访问属性 、 私有基类的成员 在私有派生类中的访问属性 私有成员 不可访问 公用成员 私有 私有 保护成员 3、例11.2 、
三、保护成员和保护继承
1、概念 、 声明的成员称为“ 由protected声明的成员称为“受保护的成员”, 声明的成员称为 受保护的成员” 或简称“保护成员” 或简称“保护成员”,保护成员可以被派生类的 成员函数引用
第十二章 继承与派生
§1 继承与派生的概念
继承: 继承:是在一个已存在的类的基础上建立一个新 的类,已存在的类称为“基类” 父类” 的类,已存在的类称为“基类”或“父类”。新 建立的类称为“派生类” 子类” 建立的类称为“派生类”或“子类”。 一个新类从已有的类那里获得其已有特性, 一个新类从已有的类那里获得其已有特性,这种 现象称为类的继承 从已有的类(父类 类的继承。 父类)产生一个新 现象称为类的继承。从已有的类 父类 产生一个新 的子类,称为类的派生 类的派生。 的子类,称为类的派生。 单继承: 单继承:一个派生类只从一个基类派生 多继承: 多继承:一个派生类有两个或多个基类 派生类是基类的具体化, 派生类是基类的具体化,而基类则是派生类的抽象

第8章_继承和派生

第8章_继承和派生

};
派生类中含有对象成员时,其构造函数的声明格式如下:
派生类的构造函数名称(参数表): 基类的构造函数名(参数表),
对象成员名1(参数表),…对象成员名N(参数表)
{
//…
//派生类构造函数体
}
class Circle2 :public Point
{
double radius;
Point P1; //基类Point的对象成员P1
{
protected
}; void main() { son sonobj;
sonobj.get(); }
8.3 派生类的构造函数和析构函数
派生类的构造函数名称(参数表):基类的构造函数名(参数表) {
… }
class Point
{ int x,y;
public:
Point(int a,int b) //基类的构造函数
Circle (double r,int a,int b):Point(a,b)
//派生类的构造函数
{ radius =r;
cout<<”Constructing Circle class \n”;
}
~ Circle () //派生类的析构函数
{ cout<<”Destructing Circle class \n”; }
使用protected声明的称为保护成员。任何一个类的保护成员 仅可以被其自己和派生类的所有非静态成员函数和友元函数直 接访问,也就是说其他的外部函数是不能访问它的。因此,对 于那些既要对外界隐藏,又要能被派生类访问的成员,可以将 它们声明为保护成员。
8.2.3三种派生方式的定义
class 派生类名 : 派生存取说明符 基类名 { //派生类新增的数据成员和成员函数 }; 1.私有(private)派生

第7章 继承和派生

第7章  继承和派生
12
例:7.3分析下列程序的结果:
class Base1 { public: Base1(int i ) { b1=i ; cout<<"Constructor of Base1."<<endl; }
void Print() const
private:
{ cout<<b1<<endl; }
int b1;
Member ( int i)
{ m=i ; cout<<"Constructor of Member."<<endl; } int GetM ( ) { return m; } private: int m; };
16
class Derived : public Base2, public Base1 ,public Base3
{ b1=i;
b2=j;
cout<<"Base's constructor called."<<b1<<","<<b2<<","<<endl;
} Base::~Base ( ) {cout<<"Base's }
destructor called."<<b1<<","<<b2<<","<<endl;
23
Base's destructor called.1,2,
27
§7.4多继承与虚基类
§7.4.1多继承中的二义性问题 产生二义性问题主要有两种情况: ㈠产生二义性问题的第一种情况如下例: 如P215图7.4(a) class Base1 { public: void fun(); };

总结-----c 之继承和派生

总结-----c  之继承和派生

继承和派生一.继承(inheritance):在一个已存在的类的基础上建立一个新的类。

在c++中可重用性是通过继承这一机制实现的。

派生(derived):在已有类的基础上新增自己的特性而产生新类的过程。

共享基类的成员。

派生类不会继承基类的友元关系。

派生类同时也是一个组合:创建一个新类,类中的一个或者多个对象是其他类的成员。

被继承的类称为基类(base class),派生出的类称为派生类(derived class)。

一个派生类可以从一个基类派生,称之为单继承。

也可以从多个基类派生,称之为多继承。

派生过程基类不会作出改变。

派生类则除了继承基类所有可引用的成员外,还可以另外定义新的成员。

继承首先是代码重用的一种机制,但另一个重要的特性在于:继承描述了一组类,这组类在一个相关联的层次上,一个类可以看作是另一个类。

二.继承的目的:实现代码重用。

通过继承机制,可以利用已有的数据类型来定义新的数据类型。

派生的目的:当新的问题出现,原有程序无法解决时,对原有程序进行改造。

三.派生类的声明Class 派生类名:继承方式基类名{派生类新增加的成员声明;}派生类一部分是从基类继承的成员,一部分是在声明派生类时新增加的部分。

四.派生生成过程。

1.吸收基类成员:吸收除构造函数和析构函数外的数据。

2.改造基类成员:声明一个和基类成员同名的新成员,派生类中的新成员就屏蔽了基类同名成员称之为同名覆盖。

这里的屏蔽或者覆盖并不是真正意义上的覆盖,依然可以通过基类名加作用域操作符(::)进行访问。

3.发展新成员:派生类新增加的成员。

新增加的成员需与基类成员不同命。

4.重写构造函数和析构函数:被重新定义的基类函数是虚函数,则称派生类中同名函数为重写。

派生类不会继承基类的构造函数和析构函数。

五.继承方式:继承方式不同影响派生类成员对基类成员访问权限。

1.Pubulic access(公有继承):派生类继承基类的public和protected 且访问属性不变。

第08章 继承与派生

第08章 继承与派生
在存在名称覆盖的情况下直接使用派生类的对象访问的是派生类中的成员通过基类对象访问的是基类中的成员见示例程序多重继承中的二义性一般来说一个类中的成员应该是唯一的同名函数可以通过参数列表加以区分此谓函数重载对于多重继承中的派生类如果多个基类中拥有相同的成员那么派生类在继承各个基类的成员之后该派生类中将出现不唯一的成员此谓多重继承中的二义性程序不访问派生类的二义性成员时不会报编译错误但一旦访问派生类的二义性成员将会报编译错误见示例程序多重继承中二义性的解决办法在派生类中定义相同成员覆盖基类中的成员
作业
教材P270-1.填空题之(1)至(6)
有派生时”改为“ (4)之 注:(4)之“当私有派生时”改为“当公有派生 时”
类名(形参总表):基类1名(实参表),…,成员变量1名(实参表),…{…}
各个构造函数的调用次序是:首先按照类定义中基类的次 序,调用各个基类的构造函数,其次按照类定义中成员的 次序,调用各个成员的构造函数,最后执行派生类构造函 数中的代码。析构函数的调用次数与之相反(见示例程序)
类型兼容
类型兼容是指在公有继承的情况下,一个派生类 对象可以作为基类的对象来访问。类型兼容有三 种使用场景:
手脑并用
做到“上机、上机、再上机”
切忌浮躁
如果你愿意利用5年时间来成为高手,那么你只要两 三年就会成为高手,如果你想一年就成为高手,那 么你5年也成不了高手
继承/派生概述
现实世界中的许多事物,它们之间具有“一般与特殊” 的关系。例如:人是一个群体,学生也是一个群体,某 个具体的学生,他/她既具有人的特征也具有学生的特征 在面向对象的程序设计中, “一般与特殊”的关系使用 继承/派生机制实现,该机制利用已有的“一般”类来定 义新的“特殊”类,使得新类不仅拥有自己的属性和操 作,而且也拥有原有类的属性和操作,实现了代码级别 上的复用 原有类称为基类(Base Class)或父类(Super Class),新 类称为派生类(Derived class)或子类(Sub Class) 子类拥有父类属性和操作这一过程称为继承(Inherit); 由父类产生子类的过程称为派生(Derive)

《继承和派生》课件

《继承和派生》课件
时提供默认值。
派生类的析构函数
派生类析构函数在销毁派生类对象时 自动调用,用于释放派生类所占用的 资源。
派生类析构函数可以包含代码,用于 清理派生类所占用的资源。
派生类析构函数可以访问基类的析构 函数,通过使用`this`关键字调用基类 析构函数。
派生类析构函数可以重载基类析构函 数,以便在销毁派生类对象时执行特 定的操作。
基类析构函数的调用
在派生类的析构函数中,可以通过使用`this`关键字调 用基类的析构函数,以确保基类资源得到正确释放。
输标02入题
如果在派生类的析构函数中没有显式调用基类的析构 函数,则编译器会自动调用基类的默认析构函数。
01
03
在某些情况下,可能需要显式调用基类的析构函数, 以确保资源得到正确释放。例如,当基类包含动态分
02 继承的方式
公有继承
总结词
公有继承是指子类可以访问父类的公有成员。
详细描述
在公有继承中,子类可以访问父类的公有成员(即不加任 何修饰符的成员),这些成员在子类中保持公有属性。子 类可以继承和使用父类的公有成员,包括函数、变量、常 量等。
总结词
公有继承是实现代码复用的一种方式。
详细描述
通过公有继承,子类可以继承父类的公有成员,从而避免 重复编写相同的代码。这有助于提高代码的复用性和维护 性。
注意事项
虚函数和纯虚函数的使用 应合理规划,避免过度使 用导致程序复杂度和维护 成本增加。
继承和派生的效率问题
继承
通过共享已存在的代码, 减少代码冗余。但也可能 导致内存浪费和性能下降 。
派生
通过扩展已有类,增加新 功能或修改已有功能。但 也可能导致内存消耗增加 和性能下降。
注意事项

派生与继承的关系,及派生应用中要注意的问题

派生与继承的关系,及派生应用中要注意的问题

派生与继承的关系,及派生应用中要注意的问题
派生(也称为继承)是面向对象编程中的一个重要概念,它允许一个类(派生类或子类)继承另一个类(基类或父类)的属性和方法。

派生与继承的关系如下:
1. 代码重用:通过继承,派生类可以复用基类的代码,减少代码重复。

2. 扩展性:派生类可以在继承基类的同时添加新的属性和方法,以实现更复杂的功能。

3. 多态性:通过继承,可以实现多态性,即父类指针或引用可以指向子类对象,调用子类的方法。

在派生应用中,需要注意以下几个问题:
1. 封装性:要确保基类的属性在派生类中仍然保持封装性,即不要在派生类中直接访问基类的私有属性。

2. 构造函数:如果基类有构造函数,派生类需要显式调用基类的构造函数,或者在派生类的构造函数中实现与基类构造函数相同的功能。

3. 虚函数和纯虚函数:如果基类中有虚函数或纯虚函数,派生类需要实现这些函数或者声明这些函数为纯虚函数。

4. 访问权限:要确保派生类中的成员函数能够访问基类的公有成员和保护成员,但不能访问基类的私有成员。

5. 覆盖和隐藏:如果基类和派生类中有同名函数,则派生类中的函数会覆盖基类中的函数(也称为重写)。

如果基类中的函数是公有或保护的,而派生类中的函数是私有的,则称为隐藏。

覆盖和隐藏可能会引起一些问题,需要注意区分和处理。

继承与派生

继承与派生
新的类,而派生得到的子类还可以继续派生出更新的子类。 因此,每个类都可以是其他类的父类,也可以是其他类的 子类与子类 之间的关系
子类是对父类的具体化 子类是父类的延续 子类是父类的组合
1.2 派生类的生成
• 吸收父类成员 将父类的成员数据与成员函数完整的,不加修改
1.3 继承方式
私有继承
在私有继承情况下,当父类的成员数据或成员函数的访 问权限是public或protected,当用户在子类中访问这些派 生而来的数据与函数时,其访问权限都是private,只有子 类自身的实例可以使用这些数据与函数。而在子类以外, 不能通过子类的成员函数来访问这些数据。而父类中的私 有成员在子类中是不能访问的。特别强调的是,即使是子 类派生而出的新的子类也不能访问这些数据与函数。也就 是说,在私有继承方式下,任何类只能派生出一个子类, 而当派生出子类在派生出新的子类时,最先的父类就不起 作用了。私有继承是C++中默认的继承模式。
的继承过来。
• 改造基类成员
对父类中的成员进行相关改造,使之更加符合派生子类的 要求。改造通过有两方面内容:访问权限与同名覆盖。
• 添加新成员
新的类与父类最突出的区别在于,用户在新的类中定义了 新的成员数据或成员函数。
1.3 继承方式
公共继承
在公共继承情况下,如果父类成员的访问权限是public 或protected时,子类继承而得的父类成员的权限不变。也 就是说,此时,父类的成员数据与成员函数被子类以公共 方式继承后,则用户在子类中访问这些派生而来的数据的 权限与在父类直接访问这些数据的权限一致。此时,用户 在子类外可以利用子类的对象访问这些数据。而当父类成 员的访问权限是private时候,子类不能访问这些私有成员。

继承和派生

继承和派生

派生类构造函数调用顺序:
基类的构造函数;
子对象的构造函数;
派生类构造函数体;
二、派生类的析构函数
析构函数不能被继承; 执行派生类的析构函数时,基类的析构函数也 将被调用;
析构函数的执行顺序与构造函数严格相反;
派生类的析构函数; 基类的析构函数;
[例]分析下列程序
#include <iostream.h> class B B::~B() {public: { cout<<"B's destructor called. "<<endl; } B(); void B::Print() const B(int i); { cout<<b<<endl; } ~B(); void Print() const; private: int b; }; B::B() { b=0; cout<<"B's default constructor called. "<<endl;} B::B(int i) { b=i; cout<<"B's constructor called. "<<endl; }
回答下列问题,并说明原因。
1、派生类B中成员函数f2()能否访问基类A的成员:f1()、j1和i1? 可以访问f1()和j1,不可以访问i1; 2、能否通过派生类B的对象b访问基类A成员:f1()、j1和i1? 可以访问f1(),不可以访问j1和i1; 3、派生类C的成员函数f3()能否访问直接基类B的成员f2()、j2 和i2?能否访问间接基类A的成员: f1()、j1和i1? 可以访问直接基类中的f2()和j2以及间接基类中的f1()和j1, 不可以访问i2和i1; 4、能否通过派生类C对象c访问直接基类B中的成员:f2()、j2和i2? 能否访问间接基类A中的成员: f1()、j1和i1?

第八讲 继承与派生总结

第八讲 继承与派生总结

第8讲 继承与派生在C++中所谓“继承”就是在一个已存在的类的基础上建立一个新的类。

已存在的类称为“基类(base class)”或“父类(father class)”。

新建立的类称为“派生类(derived class)”或“子类(son class)”。

1.类的继承与派生派生类是在基类的基础上产生的特殊类,派生类自动继承了基类的成员。

派生类具有自身的属性和行为,不然就完全等同于基类,这样就没有必要派生新类。

继承是为了避免代码的重复继承是为了避免代码的重复派生是为了使新产生的派生类除具有基类的共性之外,还具有其他个性。

设计两个类,一个类描述点,另一个类描述圆。

圆由圆心和半径构成,圆类由点类派生而来,其中圆心的特性由点类继承下来。

#include "iostream.h"class Point{int m_x,m_y;public:Point(int x,int y){m_x=x;m_y=y;}int get_x(){return m_x;}int get_y(){return m_y;}};class Circle:public Point { 描述点的类的设计: ①数据成员 点的坐标值(x,y) ②成员函数 根据需要定义。

如构造函数、取值函数、设值函数 Public 继承double radius;public:Circle(int x,int y,double r):Point(x,y){radius=r;}double Area(void){return 3.14*radius*radius;}int get_centreX(){return get_x();}int get_centreY(){return get_y();}};void main(){int x,y;double r;cout<<"x=";cin>>x;cout<<"y=";cin>>y;cout<<"r=";cin>>r;Circle c(x,y,r);cout<<"the centre of the Circle is the point("<<c.get_centreX()<<","<<c.get_centreY()<<")"<<endl;cout<<"the Area of the Circle is "<<c.Area()<<endl;}1.3 派生类的生成过程①吸收基类成员 派生类吸收基类中除构造函数和析构函数之外的全部成员②改造基类成员③添加派生类新成员2 访问权限控制(1)先由继承方式决定,再看基类成员的访问权限3 类型兼容规则(1)类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。

08第八章继承与派生

08第八章继承与派生
一个基类成员在基类中的访问属性和在派生类中的访问属 性可能是不同的。私有基类的成员在私有派生类中的访问属 性见书中表8.2。 表8.2 私有基类在派生类中的访问属性
私有基类成员 私有成员 公有成员 保护成员来自在派生类中的访问 属性
不可访问 私有 私有
C++程序设计基础
8.4.3 保护成员和保护继承
由protected声明的成员称为“受保护的成员”,或简 称“保护成员”。
此外,在声明派生类时,一般还应当自己定义派生类的构 造函数和析构函数,因为构造函数和析构函数是不能从基类 继承的。
C++程序设计基础
实际上,并不是把基类的成员和派生类自己增加的成员简单 地加在一起就成为派生类。构造一个派生类包括以下3部分工 作:
(1)从基类接收成员。 派生类把基类全部的成员(不包括构造函数和析构函数)接收 过来,也就是说是没有选择的,不能选择接收其中一部分成员, 而舍弃另一部分成员。 要求我们根据派生类的需要慎重选择基类,使冗余量最小。 事实上,有些类是专门作为基类而设计的,在设计时充分考虑 到派生类的要求。 (2)调整从基类接收的成员。 接收基类成员是程序人员不能选择的,但是程序人员可以对 这些成员作某些调整。 (3)在声明派生类时增加的成员。 这部分内容是很重要的,它体现了派生类对基类功能的扩展。 要根据需要仔细考虑应当增加哪些成员,精心设计。
派生类中不可访问的成 员
在派生 类中 可以
可以
可以
不可以
在派生类 在下层公有派
外部
生类中
可以
可以
不可以
不可以
不可以
不可以
不可以
不可以
C++程序设计基础
8.5 派生类的构造函数

第八章 继承与派生

第八章 继承与派生

一般来说,公有派生是绝对主流。
公有派生与私有派生
1. 公有继承(public)。 公有继承的特点是基类的公有成员和保护成员作为派生 类的成员时,它们都保持原有的状态,而基类的私有成员仍 然是私有的。 2. 私有继承(private)。 私有继承的特点是基类的公有成员和保护成员作为派 生类的私有成员,并且不能被这个派生类的子类访问。
基类 派生类 基类 public public Protected protected private private private 不可见 private 派生 派生类 protected 基类 public protected private 派生类 public proteced
不可见
不可见
在派生类对象外 访问派生类对象 的基类成员
可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问
公有派生
私有派生
(1)在公有继承时,派生类的对象可以访问基类中的公有成 员;派生类的成员函数可以访问基类中的公有成员和保护成员。 这里,一定要区分清楚派生类的对象和派生类中的成员函数对 基类的访问是不同的。 (2)在私有继承时,基类的成员只能由直接派生类访问,而 无法再往下继承。
继承与派生的概念 派生类的构造函数与析构函数 多重继承与派生类成员标识 虚基类 类层次中成员名的作用域 类层次中类转换规则 多重继承的应用例子 MFC基础类及其层次结构
继承与派生的概念
层次概念是计算机的重要概念。通过继承(inheritance)的 机制可对类(class)分层,提供类型/子类型的关系。C++通过 类派生(class derivation)的机制来支持继承。继承是类之间定 义的一种重要关系。定义类B时,自动得到类A的操作和数据属性, 使得程序员只需定义类A中所没有的新成分就可完成在类B的定义, 这样称类B继承了类A,类A派生了类B,A是基类(父类),B是 派生类(子类)。这种机制称为继承。 称已存在的用来派生新类的类为基类(base class) ,又称 为 父 类 。 由 已 存 在 的 类 派 生 出 的 新 类 称 为 派 生 类 ( derived class) ,又称为子类。派生类可以具有基类的特性,共享基类 的成员函数,使用基类的数据成员,还可以定义自己的新特性, 定义自己的数据成员和成员函数。基类和派生类的集合称作类继 承层次结构(hierarchy) 在C++语言中,一个派生类可以从一个基类派生,也可以从 多个基类派生。从一个基类派生的继承称为单继承;从多个基类 派生的继承称为多继承。下图反映了类之间继承和派生关系。

8 继承与派生

8 继承与派生

实现了数据隐藏,又方便继承,实现代码重用。
8.2 访问权限控制
例 如,
class A { protected: int x; } int main( ) { A a; a.x=5; //错误 }
8.2 访问权限控制
一、公有继承的访问权限控制
• 基类的public和protected成员的访问属性在派生类中保持不变,但基类 的private成员不可访问。 • 派生类中的成员函数可以直接访问基类中的public和protected成员,但
不能访问基类的private成员。
• 通过派生类的对象只能访问基类的public成员。
之间具有一定的语义连接关系,该关系表达了类之间的一种相关性。 B. 依赖(Dependency)关系 描述的是两个类之间的语义上的连接关系,它是一种“Use-A”关系。 假设有两个元素A与B,如果修改元素A的定义可能会引起对另一个元
素B的定义的修改,则称元素B依赖于A。
8.1 基本概念
C. 聚合(Aggregation)关系 聚合关系是一种“Has-A”关系,体现的是类之间的一种整体与部分的 关系。例如汽车包括四个轮子和一个发动机等。 D. 泛化(Generalization )关系 泛化关系是一种“Is-A”关系,描述类之间的“一般”与“特殊”的关 系。具有共同特性的元素可以抽象为一般类,并通过增加其内涵,进
(1).通过派生类定义时的继承方式来控制。
(2).定义同名成员屏蔽基类成员。 3. 添加派生类新成员 根据需要,在派生类中添加新成员,保证派生类在功能上有所发展。
8.1 基本概念
派生类是基类的具体化 类的层次通常反映了客观世界中某种真实的模型。
派生类是基类定义的延续
先定义一个抽象基类,该基类中有些操作并未实现。 派生类是基类的组合 在多继承时,一个派生类有多于一个的基类,这时派生类将是所有基 类行为的组合。

第8章 继承和派生

第8章 继承和派生
1.private类成员 1.private类成员
一个类中的私有(private)成员(包括数据成员和成员函数) 一个类中的私有(private)成员(包括数据成员和成员函数) 只能被它们所在类的成员函数和友元函数访问, C++中类成员 只能被它们所在类的成员函数和友元函数访问,在C++中类成员 存取说明符缺省的情况下的存取特征都是私有的(private)。 存取说明符缺省的情况下的存取特征都是私有的(private)。
8.2Βιβλιοθήκη 派生类成员的访问控制既然派生类中包含基类成员和派生类自己增加的成员, 既然派生类中包含基类成员和派生类自己增加的成员,就 产生了这两部分成员的关系和访问属性的问题。 产生了这两部分成员的关系和访问属性的问题。在建立派 生类的时候, 生类的时候,并不是简单地把基类的私有成员直接作为派 生类的私有成员, 生类的私有成员,把基类的公用成员直接作为派生类的公 用成员。实际上, 用成员。实际上,对基类成员和派生类自己增加的成员是 按不同的原则处理的。 按不同的原则处理的。
2.基类与派生类 2.基类与派生类
交通工具
飞机
滑翔机
直升飞机
喷气式飞机
已存在的类(例如“交通工具” 称为“基类” 已存在的类(例如“交通工具”)称为“基类”或“父类”。 父类” 新建立的类(例如“飞机” 称为“派生类” 子类” 新建立的类(例如“飞机”)称为“派生类”或“子类”。
一个基类可以派生出多个派生类, 一个基类可以派生出多个派生类,每一个派生类又可以作 为基类再派生出新的派生类, 为基类再派生出新的派生类,因此基类和派生类是相对 而言的。 而言的。
//定义一个基类(Student类) //定义一个基类(Student类 定义一个基类 class Student { public: //姓名 char name[10]; //姓名 int age; //年龄 //年龄 //性别 char sex; //性别 //班级名称 char classname[20]; //班级名称 }; //定义一个派生类 GraduateStudent类 定义一个派生类( //定义一个派生类(GraduateStudent类) class GraduateStudent : public Student { public: //导师 char Advisorname[10]; //导师 //资格考试分 int qualifiergrade; //资格考试分 };
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四继承与派生
实验名称:继承与派生学时安排:4
实验类别:设计性实验实验要求:1人1组
一、实验目的和任务
1.理解继承的含义;
2.学习从现有类派生出新类的方式;
3.了解在派生类中如何使用基类的成员。

二、实验设备介绍
软件需求: Visual C++ 6.0或VS2008
硬件需求: 对于硬件方面的要求,建议配置是Pentium III 450以上的CPU处理器,64MB 以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。

三、实验内容和步骤
1.新建一个雇员类,它的数据成员有雇员代号,年龄,工资,性别,姓名,输入雇员资料方法,打印雇员资料方法。

2.以此雇员类为基类,从中派生出教师类,其中要求在教师类中加入一个计算教师工资的方法,教师工资=基本工资(1000)+课时(月工作量)×30。

3.以此雇员类为基类,从中派生出实验员类,其中要求在实验员类中加入一个计算实验员工资的方法,实验员工资=基本工资(800)+实验室补助(150)+值班课时(月工作量)×5。

4. 以此雇员类为基类,从中派生出行政人员类,其中要求在行政人员类中加入一个计算行政人员工资的方法,行政人员工资=基本工资(2000)+行政补贴(200)。

5.编写一个完整的程序,要求用户从键盘输入雇员的信息,然后在屏幕显示这些信息。

【任务分解】
【程序示例】
文件Employee.h
class Employee
{
protected:
//补充完成数据成员定义
public:
……
void inputEmployee(); // 用户从键盘输入雇员姓名和受聘日期
void showEmployee(); // 显示雇员姓名和受聘日期
};
文件Teacher.h
#include "Employee.h"
class Teacher:补充完成代码
{
private:
// 补充完成数据成员定义:如基本工资、课时量。

public:
……
void inputData();
void showData ();
void calPay(); //计算工资
};
文件Run.cpp
#include " Teacher.h"
#include <iostream>
using namespace std;
int main()
{
Teacher t1;
t1. inputData ();
t1. showData ();
return 0;
}。

相关文档
最新文档