第5章 继承和派生类
第5章 继承和派生类
对类B的对象初始化即是对x,y,z,m,n等全部成员的初始化
5.4.2 私有继承
私有派生,派生类中基类的公有和保 护成员成为私有
class ClassName : private BaseClassName
私有派生时,基类中公有成员和保护成员在派生类 中均变为私有,在派生类中仍可直接使用这些成员,基 类中的私有成员,在派生类中不可直接使用。
15
从一个基类派生一个类的一般格式为:
class ClassName : <Access> BaseClassName
{ private: public:
派生类名 继承方式 基类名
......; //私有成员说明
......; //公有成员说明
protected:
派生类中新增加的成员
......; //保护成员说明
C++程序设计
主讲:王新祥
第5章 继承和派生类
2
5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9
继承与派生的概念 派生类的声明方式 派生类的构成 派生类成员的访问属性 派生类的构造函数和析构函数 多重继承 基类与派生类的转换 继承与组合 继承在软件开发中的重要意义
3
继承性是面向对象程序设计中最重要的机制。这 种机制提供了无限重复利用程序资源的一种途径。通 过C++语言中的继承机制,可以扩充和完善旧的程序 以适应新的需求。这样不仅可以节省程序开发的时间 和资源,并且为将来的程序增添了新的资源。
基类:public: 在派生类和类外都可以使用 protected: 在派生类中使用 private: 不能在派生类中使用
17
class A { int x; 因为y是基类保护,所以在派生类中可以 protected: int y; 直接引用。而在类外不可直接引用。 public: int z; A(int a, int b, int c) { x=a; y=b; z=c; } //基类初始化 int Getx() { return x; } //返回x int Gety() { return y; } //返回y void ShowA() { cout<< "x="<<x<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n'; } }; 因为z是基类公有,所以 公有派生 class B : public A { 在 派 生类 中和 类 外均 可 对基类初始化 int m, n; 直接引用。 public: B(int a, int b, int c, int d, int e) : A(a, b, c) { m=d; n=e; } void Show() { cout<<"m="<<m<<'\t'<<"n="<<n<<'\n'; cout<<"x="<<Getx()<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n'; } int Sum() { return (Getx()+y+z+m+n); } }; 因为x是基类私有,所以在派生类中和类外不能直接引用 void main(void) { B b1(1, 2, 3, 4, 5); b1.ShowA(); b1.Show(); cout<<"Sum="<<b1.Sum()<<'\n';cout<<"x="<<b1.Getx()<<'\t'; cout<<"y="<<b1.Gety()<<'\t'; cout<< "z="<<b1.z<<'\n'; } 18
C++第5章习题参考答案
1.什么是类的继承与派生?继承性是面向对象程序设计的第二个重要特性,通过继承实现了数据抽象基础上的代码重用。
继承是对许多问题中分层特性的一种自然描述,因而也是类的具体化和被重新利用的一种手段,它所表达的就是一种对象类之间的相交关系。
它使得某类对象可以继承另外一类对象的特征和能力。
继承所具有的作用有两个方面:一方面可以减少代码冗余;另一方面可以通过协调性来减少相互之间的接口和界面。
通过继承方式定义的子类也称为派生类。
2.类的三种继承方式之间的区别是什么?类的继承方式有public(公有)继承、protected(保护)继承和private(私有)继承三种。
对于不同的继承方式,会导致基类成员原来的访问属性在派生类中有所变化。
表5.1列出了不同继承方式下基类成员访问属性的变化情况。
表5.1 不同继承方式下基类成员的访问属性说明:该表第1列给出3种继承方式,第1行给出基类成员的3种访问属性。
其余单元格内容为基类成员在派生类中的访问属性。
从表中可以看出:(1) 基类的私有成员在派生类中均是不可访问的,它只能由基类的成员访问。
(2) 在公有继承方式下,基类中的公有成员和保护成员在派生类中的访问属性不变。
(3) 在保护继承方式下,基类中的公有成员和保护成员在派生类中均为保护的。
(4) 在私有继承方式下,基类中的公有成员和保护成员在派生类中均为私有的。
需要注意的是:保护成员与私有成员唯一的不同是当发生派生后,处在基类protected区的成员可被派生类直接访问,而私有成员在派生类中是不可访问的。
在同一类中私有成员和保护成员的用法完全一样。
3.派生类能否直接访问基类的私有成员?若否,应如何实现?派生类不能直接访问基类的私有成员。
具体实现方式:(1) 在类定义体中增加保护段为了便于派生类的访问,可以将基类私有成员中需提供给派生类访问的部分定义为保护段成员。
保护段成员可以被它的派生类访问,但是对于外界是隐藏起来的。
这样,既方便了派生类的访问,又禁止外界对它的派生类访问。
第5章 C++继承和派生类
cout<<"age: "<<age<<endl;
cout<<"name: "<<name<<endl;
cout<<"address: "<<address<<endl;
cout<<"sex: "<<sex<<endl;
}
}
};
};
15
15/50
三、继承的方式
从一个基类派生一个类的一般格式为:
class ClassName: <Access> BaseClassName
};
因为x是基类私有,所以在派生类和类外中不能直接引用
void main(void)
{ B b1(1,2,3,4,5);
b1.ShowA(); b1.Show();
cout<< "Sum="<<b1.Sum()<<'\n';cout<<"x="<<b1.Getx()<<'\t2'0;
cout << "y=" <<b1.Gety()<<'\t';
为了能让派生类 可以访问,通常 将基类成员声明 为保护类型,而 不是私有。
{ protected:
int age string address; public: void display_1( )
void display( )
C++面向对象程序设计 第5章 继承与派生
私有派生
私有派生, 私有派生,派生类中基类公有和保护成员成为私有
class ClassName: private BaseClassName 私有派生时,基类中公有成员和保护成员在派生类中均变为私有的, 私有派生时,基类中公有成员和保护成员在派生类中均变为私有的, 在派生类中仍可直接使用这些成员,基类中的私有成员, 在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类 中不可直接使用。 中不可直接使用。 基类成员属性 公有 保护 私有 派生类 可以引用 可以引用 不可引用 派生类外 不可引用 不可引用 不可引用
中所谓“ 在C++中所谓“继承”就是在一个已存在的类的基础上建立一个新 中所谓 继承” 的类。已存在的类称为“基类 或 父类(father class)”。 。 的类。已存在的类称为“基类(base class)”或“父类 新建立的类称为“派生类 新建立的类称为“派生类(derived class)”或“子类 或 子类(son class)”。 。
A为私有派生 为私有派生
但派生并不是简单的扩充,有可能改变基类的性质。 但派生并不是简单的扩充,有可能改变基类的性质。 有三种派生方式:公有派生、保护派生、私有派生。 有三种派生方式:公有派生、保护派生、私有派生。 默认的是私有派生。 默认的是私有派生。
从一个基类派生一个类的一般格式为: 从一个基类派生一个类的一般格式为: class ClassName:<Access>BaseClassName { 派生类名 private: ......; ; public: ......; ; ......; ; } //公有成员说明 公有成员说明 //保护成员说明 保护成员说明 //私有成员说明 私有成员说明 继承方式 基类名
《继承与派生 》课件
目录
CONTENTS
• 继承与派生的基本概念 • 继承的方式 • 派生类的构造函数和析构函数 • 继承与多态 • 继承与重载
01
继承与派生的基本 概念
继承的定义
继承是面向对象编程中的一个重 要概念,它允许一个类(子类) 继承另一个类(父类)的属性和
方法。
通过继承,子类可以复用父类的 代码,减少代码冗余,提高代码
保护继承
总结词
保护继承是指基类的保护成员在派生类 中保持保护属性,可以被派生类和派生 类的对象访问。
VS
详细描述
保护继承时,基类的保护成员在派生类中 保持保护属性,可以被派生类和派生类的 对象访问。这种继承方式使得基类的保护 成员成为派生类的保护成员,可以被派生 类和派生类的对象访问。因此,派生类可 以继承基类的保护成员函数和变量。
03
派生类的构造函数 和析构函数
派生类的构造函数
派生类构造函数的作用
派生类构造函数用于初始化派生类对象,包括调用基类构造函数 和执行派生类特有的初始化操作。
派生类构造函数的执行顺序
派生类构造函数的执行顺序是在创建派生类对象时,先调用基类构 造函数,然后执行派生类构造函数体中的代码。
派生类构造函数的参数
继承和派生共同实现 了面向对象编程中的 代码复用和多态性。
派生是继承的一种表 现形式,通过派生可 以创建新的类。
02
继承的方式
公有继承
总结词
公有继承是ቤተ መጻሕፍቲ ባይዱ基类的公有成员在派生类中仍为公有成员,可以被派生类和派生类的对象访问。
详细描述
公有继承时,基类的公有成员在派生类中保持公有属性,派生类可以访问基类的公有和保护成员。这种继承方式 使得基类的公有成员成为派生类的公有成员,可以被派生类和派生类的对象直接访问,因此派生类可以继承基类 的公有成员函数和变量。
第5章 派生类与继承
void print();
};
print();
};
//定义一个基类 class person{ protected: char name[10]; int age; char sex; public: //…… }; //定义一个派生类 class employee:public person { protected: char department[20]; float salary; public: //…… };
当类的继承方式为私有继承时,基类的public成员和 protected成员被继承后作为派生类的private成员,派生类 的其他成员可以直接访问它们,但是在类外部通过派生类的 对象无法访问。
基类的private成员在私有派生类中是不可直接访问的, 所以无论是派生类成员还是通过派生类的对象,都无法直接 访问从基类继承来的private成员,但是可以通过基类提供 的public成员函数间接访问。 例5.1一个私有继承的例子
由于派生类继承了基类的成员,派生类的构造 函数需要调用基类的构造函数对其中定义于基 类的数据成员进行初始化。 给基类构造函数传递实际参数是通过向派生类 构造函数传递实际参数以及初始化列表来间接 实现传递的。
5.2.1 派生类构造函数和析构函数的执行顺 序 通常情况下,当创建派生类对象时, 首先执行基类的构造函数,随后再执行 派生类的构造函数; 当撤消派生类对象时,则先执行派生 类的析构函数,随后再执行基类的析构 函数。
例5.3 公有继承的访问规则
表5-3 公有继承的访问规则
基类成员 内部访问 对象访问 Private成员 不可访问 不可访问 public成员 可访问 可访问 protected成员 可访问 不可访问
第五部分继承与类的派生教学课件
2 类外访问属性 类成员的类外访问是指在类对象定义域外访问对象 的类成员。因此,派生类成员在类定义中声明的访 问属性确定了派生类成员的类外访问属性:
⑴ 基类成员的访问属性 ① 私有成员:不允许被访问,与派生类从基类 的继承方式无关。 ② 公有成员:依据继承方式的不同,在基类中 被设定的公有属性会发生不同的变化。 ·私有继承:基类的公有成员变为派生类的 私有成员,因此在类外不允许被访问。 ·公有继承:基类的公有成员在派生类中仍 保持公有属性,因此在类外允许被访问。
一个链表结构的整数集合可以看成是不含重复元素
的特殊整数链表,因此整数集合类可以从整数链表类
派生。整数集合类在继承了整数链表类的所有成员的
基础上,需要新增加一个能指示集合中元素个数的数
据成员,同时还需要重新定义整数链表类的插入操作
insert,禁止重复元素被插入。
class set : public list
由于派生类的成员分为继承的基类成员和自身的新 增成员两种,这两种成员的类内访问属性是有所区 别的。 ⑴ 基类成员的访问属性
封装性所限定的类成员类外访问权限确定了基类 成员在派生类定义中被访问的限定原则:
① 私有成员:不允许被访问,与派生类从基类 的继承方式无关。
② 公有成员:允许被访问,与派生类从基类的 继承方式无关。
class Customer { private:
char name[15]; int age; char sex[8]; double income; public: void print(); };
// 姓名 // 年龄 // 性别 // 收入
《继承和派生》课件
派生类的析构函数
派生类析构函数在销毁派生类对象时 自动调用,用于释放派生类所占用的 资源。
派生类析构函数可以包含代码,用于 清理派生类所占用的资源。
派生类析构函数可以访问基类的析构 函数,通过使用`this`关键字调用基类 析构函数。
派生类析构函数可以重载基类析构函 数,以便在销毁派生类对象时执行特 定的操作。
基类析构函数的调用
在派生类的析构函数中,可以通过使用`this`关键字调 用基类的析构函数,以确保基类资源得到正确释放。
输标02入题
如果在派生类的析构函数中没有显式调用基类的析构 函数,则编译器会自动调用基类的默认析构函数。
01
03
在某些情况下,可能需要显式调用基类的析构函数, 以确保资源得到正确释放。例如,当基类包含动态分
02 继承的方式
公有继承
总结词
公有继承是指子类可以访问父类的公有成员。
详细描述
在公有继承中,子类可以访问父类的公有成员(即不加任 何修饰符的成员),这些成员在子类中保持公有属性。子 类可以继承和使用父类的公有成员,包括函数、变量、常 量等。
总结词
公有继承是实现代码复用的一种方式。
详细描述
通过公有继承,子类可以继承父类的公有成员,从而避免 重复编写相同的代码。这有助于提高代码的复用性和维护 性。
注意事项
虚函数和纯虚函数的使用 应合理规划,避免过度使 用导致程序复杂度和维护 成本增加。
继承和派生的效率问题
继承
通过共享已存在的代码, 减少代码冗余。但也可能 导致内存浪费和性能下降 。
派生
通过扩展已有类,增加新 功能或修改已有功能。但 也可能导致内存消耗增加 和性能下降。
注意事项
C++05继承和派生类
B1,B2的基类 A的派生类 C1,C2,C3的基类
A A的派生类(单继承) C3的基类
B1
B2
B1的派生类
C1
C2 C3
B1,B2的派生类(多继承)
图11-1 类之间的继承与派生关系
4
1.1 派生类的定义格式
单继承的定义格式如下: class<派生类名> :<继承方式><基类名> { public: //派生类新定义成员 members; <private:> members; <protected:> members; };
19
#include <iostream.h>
class A
{ public: A(){cout<<“A Construct1”<<endl;} A(int i){x1= i;cout<<“A Construct2”<<endl;} void dispa(){cout<<“x1=”<<x1<<endl;} private:int x1; }; class B:public A { public: B(){cout<<“B Construct1”<<endl;} B(int i):A(i+10){x2= i;cout<<“B Construct2”<<endl;} void dispb(){dispa() ;cout<<“x2=”<<x2<<endl;} private:int x2;
结果: A Construct2 B Construct2 x1=12
第5章 继承与派生
15
int main() { Base b1(5, 6, 7); //cout<< b1.a; //cout<<b1.b; 无法访问对象的保护成员 cout<<b1.c<<endl; cout<<b1.geta()<<endl; Sub s1(11,15,19,22); s1.test(); s1.c = 200; s1.fun3(); return 0; }
2
单继承
图5.1 单继承
图5.2 类的层次树型结构图
3
多继承
图5.3 多继承
图5.4 单继承与多继承
4
class Student { private: int number; char name[20]; public: Student() { number=0; name[0]=’\0’; } Void SetValue(int n,char *s1) { number=n; Strcpy(name,s1); } void Print() { cout<<”Number:”<<number<<endl; cout<<”Name:”<<name<<endl; } };
第 5章
继承和派生
本章重点: 继承与派生的概念; 派生类的构造函数和析构函数的执行顺序与规 则; 多继承的声明与实现; 基类成员访问原则; 赋值兼容性; 虚基类的概念 ;
1
5.1继承与派生的概念
继承是面向对象程序设计中重要的特性 继承主要是指在己有类(基类)的基础上创建新类 的过程,这个新类就是派生类 派生类包含基类的成员,包括所有的数据和操 作,而且还可以增加新的成员
C++程序设计04737 第5章 类的继承与派生
5.1 类的继承与类的派生
5.1.2 派生类的定义与大小
2.类的大小
1. //[程序5-2]基类与子类占用空间及字节对齐
2. #include <iostream>
3. using namespace std;
4. class BaseClass //基类
5. {
6.
int v1, v2;
7.
派生类中包含了基类的成员变量,且基类
成员变量在前,派生类成员变量在后。基 类占用了12个字节,在此之后要分配派生 类自身的成员变量,一个int型变量和一个 指针变量。在64位系统中,指针占8个字 节。所以派生类的大小=12+4+8=24字节。 32位系统中指针的大小是4字节。
5.1 类的继承与类的派生
5.1 类的继承与类的派生
5.1.3 继承关系的特殊性
//[程序5-3]派生类继承了友元函数
#include <iostream>
using namespace std;
class another;//前向引用声明
class Base//基类
{private: float x;
public: void print(const another &K);};
d.print(ano);//输出: Base: 100
return 0;
}
如果派生类Derived中重写了print(),若还想在函数中访问another的私有成员,则必须将类Derived的print()函数也
声明为another的友元。在类another中需要添加如下声明:
friend void Derived::print(const another &K);//派生类的成员函数声明为本类的友元
第5章 类的派生与继承
第5章 类的派生与继承
class BaseClass //基类 {
int vl,v2; }; class DerivedClass : public BaseClass //派生类 {
int v3; };
第5章 类的派生与继承
二、派生类的定义与大小 1、派生类的定义 从基类派生派生类的一般格式: class派生类名:继承方式说明符 基类名 {
编程小技巧:同学们可以将鼠标放置于类中的任何一个成 员或者函数上,编程软件会提示,对应的访问权限,这个方法在 继承编程中特别好用。
第5章 类的派生与继承
我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公
第5章 类的派生与继承
C++程序设计
第5章 类的派生和继承
第5章 类的派生与继承
本章内容
类的继承与类的派生 访问控制 派生类的构造函数和析构函数 类之间的关系 多层次派生 基类与派生类指针的相互转换
第5章 类的派生与继承
第一节 类的继承与类的派生
常考知识点: 继承派生基本概念 继承派生在C++中起到的作用 派生类定义的方法 派生类从基类继承的元素有哪些 继承关系中友元和静态成员变量的派生特点 单继承、多重继承的概念以及异同 派生的层次
第5章 类的派生与继承
1、继承:在一个已存在的类的基础上建立一个新的类,称 为继承
2、派生:从已有的类(父类)产生一个新的子类,称为类的 派生
3、单继承:一个派生类只从一个基类派生,这称为单继承 4、多继承:一个派生类有两个或多个基类的称为多重继承
第五章 类的继承与派生
//save as car.h #include "vehicle.h" class car : public vehicle { //派生类car(轿车) public: void setcar(int aw, int ats, float ap, int anc, int ahp) {setvehicle(aw,ats,ap); //调用基类的函数初始化 numbercylinders=anc; horsepower=ahp; } void print( ) { //重定义print( ) vehicle::print( ); //调用基类的函数 cout << "\n cylinders:" << numbercylinders; cout << "\n horsepower:" << horsepower;} private: int numbercylinders; //汽缸数 int horsepower; //马力 };
子类特有的部分
子类名
public、protected 和 private分别表示公有继承、保护 继承和私有继承,定义派生类时三选一。
7
第五章 类的继承与派生
(3)说明 ①public继承 最常见的派生方式。基类成员的访问权限在派生类中保 持不变,派生类成员函数不可直接访问基类的private成员, 可通过基类的公有成员函数或保护成员函数访问。 ②private继承 基类中的所有成员在派生类中都将变为private成员。 派生类成员函数不可直接访问基类的private成员,但可直 接访问基类的public、protected成员,并通过它们访问基 类的private成员。 ③protected继承 基类的public成员在派生类中变为protected成员,基类 的protected和private成员在派生类中保持原来的访问权限。 8
第5章-派生类与继承PPT优秀课件
继承是面向对象程序设计的一个重要特性。
它允许在既有类的基础上创建新的类,新类可以从一 个或多个既有类中继承函数和数据,而且可以重新定 义或加进新的数据和函数,从而形成类的层次或等级。
既有类称为基类或父类,在它基础上建立的新类称为 派生类或子类。
公有派生和私有派生的访问特性
基类成员 派生方式 派生类成员
外部函数
基类私有成员
private 不可访问
public 不可访问
不可访问
不可访问
基类公有成员
private
public
可访问
可访问
不可访问
可访问
派生类的概念
5.1.3 保护成员
保护成员:即protected成员,是C++提供的具有另一种访问 属性的成员
}; class derive: public base {
int c;
C++规定:基类的保护成 public:
员被派生类继承之后,若
void setc(int n)
为公有派生,则基类中的 保护成员在派生类中也为
{ c=n; } void showabc() { cout<<a<<“ ”<<b<<“ ”<<c<<endl; }
int x; public:
void setx(int n) { x=n; } void showx() { cout<<x<<endl; } }; class derived : public base { int y; public: void sety( int m) { y=m; } void showy() { cout<<y<<endl; } }; int main() { derived obj; obj.setx(10); obj.sety(20); obj.showx(); obj.showy(); return 0; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010/9/18
第5章 继承和派生类
程序运行结果: x=4 y=5 l=6 w=8 程序分析: 通过公有继承方式,从BaseClas类得到DerivedClass类。 派生类DerivedClass只有一个基类,所以是单继承。基类 BaseClass定义了两个数据成员,3个成员函数。派生类 DerivedClass定义了两个数据成员,3个成员函数。通过 继承,派生类DerivedClass拥有4个数据成员:x、y、l和 w,6个成员函数:setx ( )、sety ( )、setl ()、setw ( )、 displayxy ( )、displaylw( )。
2010/9/18
面象对象程序设计
第5章 继承和派生类
class Father:private Grandfather //中间类:Grandfather的 公有派生类, //Son的基类 { public: void test() { b1=10; //可以访问,因b1改为private b2=20; //可以访问,因b2改为private b3=30; //不可访问, 因b3改为不可访问 } };
2010/9/18
面象对象程序设计
第5章 继承和派生类
5.1.2 继承的种类
在C++语言中,一个派生类既可以从一个基类派生,也可 以从多个基类派生。从一个基类派生的继承被称为单继承。 单继承形成的类层次是一个倒挂的树,如图5.2所示。从 多个基类派生类的继承被称为多继承。多继承形成的类层 次是一个有向无环图(DAG),如图5.3所示。在图5.2中, 输入设备是基类,从它派生出了3个派生类:键盘类、鼠 标类和扫描仪类。在图5.3中,从教师类和干部类派生出 校长类,即校长类有两个基类。
2010/9/18
//不可访问 //不可访问 //不可访问 //不可访问 //不可访问 //不可访问
面象对象程序设计
第5章 继承和派生类
程序分析: 程序分析 (1) 在主函数main( )中,定义了3个对象:Grandfather d1、 Father d2、Son d3。在基类Grandfather中定义了3个成 员:公有成员b1、保护成员b2、私有成员b3。 (2) b1是Grandfather类中的公有成员,通过公有继承成为派 生类Father中的公有成员,Father的成员函数test( )可以 访问它,再从Father类公有派生,b1成为Son类的公有成 员,当然Son的成员函数test( )能访问它,所以3个对象都 能够对b1访问。可见,基类的公有成员通过公有继承派生 到派生类,可以被派生类的成员函数访问,也能被派生类 对象访问。
面象对象程序设计
2010/9/18
第5章 继承和派生类
教 师
大教 学师
中教 学师
小教 学师
本生师 科教
研生师 究导
初教 中师
高教 中师
硕生师 士导
博生师 士导
图5.1 教师分类层次图
2010/9/18
面象对象程序设计
第5章 继承和派生类
(1) 增加新的成员变量。 (2) 增加新的成员函数。 (3) 重新定义已有的成员函数。 (4) 改变现有成员的属性。 继承还是面向对象程序设计中软件重用的关键技术。新的类 是原有类的数据、操作和自己所增加的数据、操作的组合。 新的类把原有类作为基类引用,而不需要修改原有类的定 义。新定义的类作为派生类引用。这种可重用、可扩充技 术大大降低了大型软件的开发难度。
第5章 继承和派生类
5.1 基类和派生类 5.2 单继承 5.3 多继承 5.4 继承机制下构造函数与析构函数的调用顺序 5.5 上机指导
主目录
第5章 继承和派生类
5.1 基类和派生类
5.1.1 继承和派生的基本概念
通过继承机制,可以利用已有的数据类型来定义新的数据类型。 根据一个类创建一个新类的过程称为继承(inheritance),也称 派生。新类自动具有原有类的成员,根据需要还可以增加新成 员。派生新类的类称为基类,又称父类,而将派生出来的新类 称为派生类,又称子类。 换句话说,继承就是创建一个具有别的类的属性和行为的新类 的能力。派生类同样能作为其他类的基类,这就产生了类的层 次性。在日常生活中,许多事物之间存在着类层次关系。
2010/9/18
面象对象程序设计
第5章 继承和派生类
【例5.2】 分析下列程序,理解公有派生基类成员的访问权 限。 class Grandfather //基类 { public: int b1; protected: int b2; private: int b3; };
2010/9/18
面象对象程序设计
面象对象程序设计
第5章 继承和派生类
【例5.1】 阅读程序,了解继承和派生类的基本概念,熟悉 单继承的定义格式。 #include<iostream.h> class BaseClass{//定义基类 private: int x,y; public: void setx(int myx){x=myx;} void sety(int myy){y=myy;} void displayxy(){cout<<"x="<<x<<" "<<"y="<<y<<endl;} };
2010/9/18
面象对象程序设计
第5章 继承和派生类
输入设备
键盘
鼠标
扫描仪
图5.2 单继承
教师 干部
校长
图5.3 多继承
2010/9/18
面象对象程序设计
第5章 继承和派生类
5.2 单继 承 5.2.1 单继承的定义格
在C++中,单一继承的一般形式为: 式 class<派生类名>:<继承方式><基类名> { private: <成员说明列表> public: <成员说明列表> };
2010/9/18
面象对象程序设计
第5章 继承和派生类
图5.1展示了教师的类层次。在分类层次图中,下 层都具有上层的特征,如中学教师是由教师类派 生出来的,具有教师类的特征。它还具有自己的 特征,它本身最大的特征是教的学生是中学生。 类的派生,或者说继承,常用来表示类属关系, 即is-A关系。如:中学教师是教师。不能将继承 理解为构成关系。当从现存类中派生出新类时, 可以对派生类做如下几种变化。
2010/9/18
//不可访问 //不可访问 //不可访问 //不可访问 //不可访问 //不可访问 //不可访问 //不可访问
面象对象程序设计
第5章 继承和派生类
程序分析: 程序分析 (1) b1是Grandfather类中的公有成员,通过私有继承成为派 生类Father中的私有成员,Father的成员函数test( )可以 访问它。再从Father类公有派生,b1成为Son类的不可访 问成员,当然Son的成员函数test( )不能访问它,所以只 有基类自己的对象d1能够对b1访 问。可见,基类的公有 成员通过私有继承派生到派生类,可以被派生类的成员函 数访问,但不能被派生类对象访问。 (2) b2是Grandfather类中的保护成员,通过私有继承成为派 生类Father中的私有成员,Father的成员函数test( )可以 访问它。再从Father类公有派生,b2成为Son类的不可访 问成员,当然Son的成员函数test( )不能访问它,所以对 象d2和d3对b2的访问均是错误的。
2010/9/18
面象对象程序设计
第5章 继承和派生类
void main() { Grandfather d1; d1.b1=1; d1.b2=1; d1.b3=1; Father d2; d2.b1=2; d2.b2=2; d2.b3=3; Son d3; d3.b1=2; d3.b2=2; d3.b3=3; }
2010/9/18
面象对象程序设计
第5章 继承和派生类
可见,基类的私有成员通过公有继承派生到派生类,既不 能被派生类的成员函数访问,也不能被派生类对象访问。 2. 私有派生基类成员的访问权限 当类的继承方式为私有继承时,在派生类中,基类的公有 成员和保护成员作为派生类的私有成员,派生类的成员函 数可以直接访问它们,而派生类的成员函数无法直接访问 基类的私有成员。在类外部,派生类的对象无法访问基类 的所有成员。
2010/9/18
面象对象程序设计
第5章 继承和派生类
void main() { Grandfather d1; d1.b1=1; d1.b2=1; d1.b3=1; Father d2; d2.b1=2; d2.b2=2; d2.b3=3; Son d3; d3.b1=2; d3.b2=2; d3.b3=3; }
2010/9/18
面象对象程序设计
第5章 继承和派生类
5.2.2 基类成员在派生类中的访问权 限 1. 公有派生基类成员的访问权限
当类的继承方式为公有继承时,在派生类中,基类的公有 成员和保护成员被继承后分别作为派生类的公有成员和保 护成员,这样使得派生类的成员函数可以直接访问它们, 而派生类成员函数无法直接访问基类的私有成员。在类外 部,派生类的对象可以访问继承下来的基类公有成员。
2010/9/18
面象对象程序设计
第5章 继承和派生类
class DerivedClass:public BaseClass{//定义派生类,公有继承方式 private: int l,w; public: void setl(int myl){l=myl;}; void setw(int myw){w=myw;}; void displaylw(){cout<<"l="<<l<<" "<<"w="<<w<<endl;}}; void main() { DerivedClass r;// 派生类对象 r.setx(4); r.sety(5); r.setl(6); r.setw(8); r.displayxy(); r.displaylw(); }