?教学目的与要求:
了解什么是继承和派生 。
掌握派生类的创建过程和派生方式
教学内容提要:
1,为什么要使用继承;
2,单基派生类的声明;
3,基类成员在派生类中访问属性
4,派生类对基类成员的访问
教学重点:单继承的派生类的定义方式和派生方式
教学难点:单继承的派生类的定义方式和派生方式
教学进度,P111~P123
教学过程:
第 12 讲 派生类的概念工具车 轿车 面包车小汽车 卡车 旅行车汽车交通工具事物的共性与特性继承 是面向对象程序设计支持代码重用的重要机制。 C++语言中,通过继承,一个新类可以在原有类的基础上派生而来,新类将共享原有类的属性,并且还可以添加新的特性。
【 12.1 为什么要使用继承 】
在 C++语言中,通过继承,可以让一个类拥有另一个类的全部属性,也即让一个类继承另一个类的全部属性。
可以把继承过程看成是 从一个类派生出一个新类的过程 。在已有类的基础上新增自己的特性而产生新类的过程称为派生。派生出来的新类称为 派生类或子类 ;而被继承的类称作 基类或父类 。
一个基类可以派生出多个派生类,一个派生类也可以由多个基类派生而来。称从一个基类派生出一个派生类的过程为 单继承 ;
从多个基类派生出一个派生类的过程为 多继承 。
计算机类台式机类 便携式类输入设备类 输出设备类外部设备类
a) 单继承
b) 多继承图 单继承与多继承通过单继承派生一个类的一般形式如下:
class 派生类名,派生方式 基类名
{
派生类新增加的数据成员和成员函数
};
是通过单继承派生出来的类的名称。
用关键字 public,private或
protected指定,如果省略,
系统将默认为 私有派生 。
指明了这个派生类的基类,这个基类必须 在声明这个派生类之前已经声明,否则,会导致编译错误。
【 12.2 单继承的派生类声明 】
例如:
class baseclass
{ int a,b;
public:
//公有成员
};
a
b
baseclass
例如:
class subclass:public baseclass
{ int c;
public:
//公有成员
};
a
b
subclass
c
基类部分派生类部分派生方式用的关键字
public:表示公有派生
private,表示私有派生
protected,表示保护派生在声明一个派生类时,采用不同的派生方式,从基类继承而来的成员的访问权限 在派生类中也有所不同 。
从已有类派生出新类时,可以在派生类内完成以下几种功能,
(1) 可以增加新的数据成员 ;
(2) 可以增加新的成员函数 ;
(3) 可以重新定义基类中已有的成员函数 ;
(4) 可以改变现有成员的属性。
当采用公有派生时,基类中的 公有( public)成员和保护
( protected)成员 的访问权限在派生类中保持不变,而基类的私有( private)成员 无论是在派生类中,还是在类外都是 不可访问的 。
基类的公有成员和保护成员被派生类继承过来,作为派生类的公有成员和保护成员;但基类的私有成员在派生类中不能直接使用。
简述
【 12.3.1 公有派生 】
【 12.3 基类成员在派生类中的访问属性 】
#include<iostream.h>
class A
{
public:
void setx(int a){x=a;}
void sety(int b){y=b;}
int getx() const{return x;}
int gety() const{return y;}
protected:
int x;
private:
int y;
};
class B:public A
{
public:
int getsum(){return x+gety());} //直接访问从基类继承来的保护成员 x;但是基
//类的私有成员 y,只能通过接口函数访问。
};
公有派生例 12-1 void main()
{
B b;
b.setx(2);
b.sety(3);
cout<<″X=″<<b.getx()<<″\ tY=″
<<b.gety()<<endl;
cout<<″X+Y=″<<b.getsum()<<endl;
}
在公有派生时,基类和派生类中的公有成员都 可以直接 通过派生类的对象名来 访问 。 一个类的保护成员只能被它自己的成员函数或它的派生类的成员函数访问,在类外不能直接访问。
X=2 Y=3
X+Y=5
当采用私有派生时,基类的 私有( private)成员与公有派生 时相同,无论是在派生类中,还是类外都是 不可访问 的。但基类中的 公有( public)成员和保护( protected)成员 的访问权限在派生类中则 变为私有 。
基类的公有成员和保护成员被派生类继承过来,作为派生类的私有成员;而基类的私有成员在派生类中不能直接使用。
简述
【 12.3.2 私有派生 】
#include<iostream.h>
class A
{
public:
void setx(int a){x=a;}
void sety(int b){y=b;}
int getx() const{return x;}
int gety() const{return y;}
protected:
int x;
private:
int y;
};
class B:private A
{
public:
void setBx(int a){setx(a);}
void setBy(int b){sety(b);}
私有派生说明:类 B是由类 A私有派生而来的,类 A
中的公有和保护成员被类 B继承过来后,
作为私有成员,因此,通过类 B的对象名无法直接访问类 A中的任一成员。
例 12-2
int getBx(){return getx();}
int getBy(){return gety();}
int getsum(){return x+gety();}
};
void main()
{
B b;
cout<<″X=″<<b.getBx()<<″\ tY=″<<b.getBy()<<endl;
cout<<″X+Y=″<<b.getsum()<<endl;
}
X=2 Y=3
X+Y=5
(续)
b.setBx(2);
b.setBy(3);
etx(2); //error
ety(3); //error
例 12-3 保护派生
#include<iostream.h>
class A
{
public:
void setx(int a){x=a;}
void sety(int b){y=b;}
int getx() const{return x;}
int gety() const{return y;}
当采用保护派生时,基类的 私有( private)成员与公有派生 时相同,无论是在派生类中,还是类外都是 不可访问 的。但基类中的 公有( public)成员和保护( protected)成员 的访问权限在派生类中则变为 保护 。
基类的公有成员和保护成员被派生类继承过来,作为派生类的保护成员;而基类的私有成员在派生类中不能直接使用。
简述
【 12.3.3 保护派生 】
protected:
int x;
private:
int y;
};
class B,protected A
{
public:
void setBx(int a){setx(a);}
void setBy(int b){sety(b);}
int getBx(){return getx();}
int getBy(){return gety();}
int getsum(){return x+gety();}
};
void main()
{
B b;
b.setBx(2);
例 12-3 保护派生
b.setBy(3);
cout<<″X=″<<b.getBx()<<″\ tY=″<<b.getBy()<<endl;
cout<<″X+Y=″<<b.getsum()<<endl;
}
引入保护成员的意义 在于使类中的这些成员对该类及它的派生类是可见的,但在程序的其他部分与私有成员一样,是不可见的。
X=2 Y=3
X+Y=5
(续)
派 生 类 型 基类成员特性 派生类成员特性公有( public) 公有( public)
保护( protected) 保护私有( private) 不可访问公有( public) 私有( private)
保护( protected) 私有( private)
私有( private) 不可访问公有( public) 保护( protected)
保护( protected) 保护公有派生
( public)
私有派生
( private)
保护派生
( protected)
私有( private) 不可访问表 不同派生类型中相应基类及派生类的访问特性派生类对基类成员的访问形式主要有以下两种,
(1) 内部访问,由派生类中新增成员对基类继承来的成员的访问。
(2) 对象访问,在派生类外部,通过派生类的对象对从基类继承来的成员的访问。
【 12.4 派生类对基类成员的访问规则 】
1,私有继承的访问规则当类的继承方式为私有继承时,基类的 public成员和
protected成员被继承后作为派生类的 private成员,派生类的其他成员可以直接访问它们,但是在类外部通过派生类的对象无法访问 。
基类的 private成员在私有派生类中是不可直接访问的,
所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的 private成员,但是可以通过基类提供的
public成员函数间接访问。
教材 4.1一个私有继承的例子
2,公有继承的访问规则当类的继承方式为公有继承时,基类的 public成员和
protected成员被继承到派生类中仍作为派生类的 public成员和 protected成员,派生类的其他成员可以直接访问它们 。 但是,类的外部使用者只能通过派生类的对象访问继承来的
public成员 。
基类的 private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的 private成员,但是可以通过基类提供的
public成员函数间接访问它们。
教材例 4.3 公有继承的访问规则表 私有继承的访问规则基类成员 private成员 public成员 protected成员内部访问对象访问不可访问不可访问可访问不可访问可访问不可访问
3,保护继承的访问规则当类的继承方式为保护继承时,基类的 public成员和
protected成员被继承到派生类中都作为派生类的 protected
成员,派生类的其他成员可以直接访问它们,但是类的外部使用者不能通过派生类的对象来访问它们 。
基类的 private成员在私有派生类中是不 可直接访问的,
所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类的 private成员。
教材例 4.4 保护继承的访问规则。
表 公有继承的访问规则基类成员 Private成员 public成员 protected成员内部访问对象访问不可访问不可访问可访问可访问可访问不可访问在程序的任何部分如果声明有一个类的对象,就可以通过这个对象访问对象所属类中的所有公有成员,但 不能访问其私有和保护成员 ;而一个派生类的函数成员则 可以访问 所属类中的新声明的所有成员,以及派生它的基类中的公有和保护成员。一个类的私有成员只能被所属类的成员函数访问,
在其他任何地方都不可见 。
注表 保护继承的访问规则基类成员 private成员 public成员 protected成员内部访问对象访问不可访问不可访问可访问不可访问可访问不可访问小结
1、派生类的声明格式
2、三种不同的派生方式
3、派生类对基类成员的访问规则作业:
P158 4.1,4.2