继 承(一)
DESCRIPTION
继 承(一). 继承的含义. 不同的类具有相似的特征 磁卡电话, IC 卡电话,手机,普通电话 麻雀,燕子,鸽子,大雁 分类. 鸟. 麻雀. 燕子. 鸽子. 大雁. 继承的含义. 由简单到复杂. 汽车. 小汽车. 卡车. 旅行车. 工具车. 小轿车. 面包车. 概念. 基类( base class ) 派生类( derived class ) 一个类可以既是基类,又是派生类. 继承的分类. 单继承和多继承. 汽车. 学生. 老师. 小汽车. 大汽车. 助教博士. 继承的定义. class base { - PowerPoint PPT PresentationTRANSCRIPT
继 承(一)
继承的含义• 不同的类具有相似的特征
– 磁卡电话, IC 卡电话,手机,普通电话– 麻雀,燕子,鸽子,大雁
• 分类鸟
麻雀 燕子 鸽子 大雁
继承的含义• 由简单到复杂
汽车
小汽车 卡车 旅行车
工具车 小轿车 面包车
概念
• 基类( base class )• 派生类( derived class )
• 一个类可以既是基类,又是派生类
继承的分类
• 单继承和多继承
小汽车 大汽车 助教博士
汽车 学生 老师
继承的定义class base {int a; // 私有成员
public:void setA(int a1);
};
class derived : public base {int b; // 私有成员
public :void setB(int b1);
};
派生类(子类)
基类(父类)
继承的方式• public 、 protected 和 private
基类成员的访问控制
public继承
protected继承
private继承
private
protected
public
private
protected
public
private
protected
protected
private
private
private
基类成员在派生类中的访问控制
派生类• 派生类也是类
– 可以有自己的数据成员和函数成员
• 派生类又是特殊的类– 基类的所有成员也是派生类的成员– 即:派生类继承了基类所有的成员
派生类成员的访问控制• 派生类本身的成员
– 遵循通用的访问控制策略
• 派生类继承来的成员– 派生类本身的函数成员可以访问基类的公有
和保护成员– 通过派生类对象只可以访问派生类和基类的
公有成员
访问控制class base {
private:
int a;
protected:
int b;
public:
void SetA(int a1) { a = a1; }
void SetB(int b1) { b = b1; }
};
访问控制class derived : public base {
private:
int c;
protected:
int d;
public:
void SetC(int c1) { c = c1; }
void SetD(int d1) { d = d1; }
void Set_A(int a1) { a = a1; } //
void Set_B(int b1) { b = b1; } //
};
访问控制base obj1;
derived obj2;
// 可以通过派生类对象访问基类的公有成员obj2.SetA(1);
obj2.SetB(2);
// 可以直接访问派生类的公有成员obj2.SetC(3);
obj2.SetD(4);
protected 的作用• 封闭性和开放性的结合
– 不能被一般函数访问– 能被派生类函数成员访问
• 为派生类提供了访问基类成员的特权
public 可访问 可访问
访问控制小结( public 继承方式)
基类成员的访问控制
对派生类成员的可访问性
private
protected
对派生类对象的可访问性
不可访问可访问
不可访问不可访问
public
在派生类中的访问控制
private
protected
派生类对象的构造
• 派生类的构造函数中必须启动基类的构造函数(有缺省构造函数除外)
派生类的构造函数class base {
protected:
int a;
public:
base(int a1) { a = a1;} // 构造函数
};
派生类的构造函数class derived : public base {
int b;
public:
derived(int a1, int b1);
};
derived :derived(int a1,int b1) : base(a1)
{
b = b1;
}
构造函数的执行顺序• 对象构造时
– 先执行基类的构造函数– 再执行派生类的构造函数
derived dobj(2,3);先执行: a = 2;再执行: b = 3;
析构函数的调用顺序
• 析构时– 先调用派生类的析构函数– 再调用基类的析构函数
单继承举例
• 磁盘 Disknamesidestrackssectors_per _trackbytes_per_sector
FloppyDiskwrite_protect
HardDiskcontroller_type
Disk 类的定义class Disk {
public:
Disk(char *nme int side, int track, int spt, int bps);
long Capacity();
private:
char name[64];
int sides;
int tracks;
int sector_per_track;
int bytes_per_sector;
};
FloppyDisk 类的定义
class FloppyDisk : public Disk {
public:
FloppyDisk(char *name, int sides, int tracks, int spt, int bps, bool wp);
void setWriteProtect( int state);
private:
bool write_protect;
};
HardDisk 类的定义
class HardDisk : public Disk{
public:
HardDisk(char *name, int sides, int tracks, int spt, int bps, char * type);
void set_controller_type(char *);
private:
char controller_type[64];
};
Disk 类的实现
Disk::Disk(char *nme int side, int track, int spt, int bps)
{
name = nme;
sides = side;
tracks = track;
sector_per_track = spt;
byte_per_sector = bps;
}
HardDisk 类的实现
HardDisk:: HardDisk(char *name, int sides, int tracks, int spt, int bps, char * type): Disk(name, sides, tracks, spt, bps)
{
strcpy(controller_type, type);
}
FloppyDisk 类的实现
FloppyDisk::FloppyDisk(char *name, int sides, int tracks, int spt, int bps,bool wp) : Disk(name, sides, tracks, spt, bps)
{
write_protect = wp;
}
多继承举例
填充类填充颜色填充图形
填充矩形类
填充矩形
矩形类长宽
Filled 类的定义class Filled {
protected:int fillColor;int fillType;
public:Filled(int filleColor, int fillType);void FillGraph(Scope scope);
};
Rectangle 类的定义class Rectangle { protected:
Point topLeft, bottomRight;int lineColor;
public:Rectangle(Point top_left, Point bottom_right, int line_color);Rectangle();long Area(); // 求矩形面积void Draw(); // 绘制矩形
};
FilledRectangle 类的定义class FilledRectangle : public Filled, public Rectangle {
private:GetScope(Scope & scope);
public:FilledRectangle(Point top_left, Point
bottom_right, int line_color);Draw(); // 绘制填充矩形
};
FilledRectangle 类的实现
void FilledRectangle::Draw(){
Rectangle::Draw(); // 调用基类的函数Scope scope;GetScope(scope); // 取矩形的范围 FillGraph(scope); // 调用基类的函数
}
多级继承
人员
工作人员
管理人员
电话
无线电话
脉冲电话
有线电话
音频电话
Person 类的定义class Person {
protected:char name[64];int age;
public:Person(char *name, int age);char * GetName();int GetAge();
};
Worker 类的定义class Worker : public Person {
protected:
float wage;
int workID; // 工作证号public:
Worker(char *name, int age, float wage, int
workID);
void ChangeWage(int newWage);
};
Worker 类的实现
Worker::Worker(char *name, int age, float wage, int workID) : Person(name, age)
{
Worker::wage = wage;
Worker::workID = workID;
}
Manager 类的定义class Manager : public Worker {
protected:
int bonusLevel; // 红利等级char office[64]; // 办公室public:
Manager(char *name, int age, float wage, int
workID, int bonus_level, char * office);
void ChangeOffice( char * new);
};
Manager 类的实现
Manager::Manager(char *name, int age, float wage, int workID, int bonus_level, char * office) :
worker(name, age, wage, workID)
{
Manager::bonus_level = bonus_level;
strcpy(Manager::office, office);
}
小结• 继承的含义• 继承的分类• 派生类成员的访问控制• 构造函数和析构函数• 继承举例
函数重载• 派生类的成员函数可以重载基类的成员函数
FilledRectangle fr;
fr.Draw(); // 调用 FillRectangle::Draw()
fr.Rectangle::Draw(); // 调用 Rectangle::Draw()
fr.Area(); // 调用 Rectangle::Area()