继承PPT课件
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 继承方式包括: public(公用的), private(私有的) protected(受保护的)
• 默认为private(私有的)
派生类的声明
假设已声明了一个基类Student,通过单继承建立一个派生类 Student1:
class Student1: public Student //声明基类是Studen
void display1( ); private:
int age; string addr; };
void Student1::display1( ) {cout<<″num: ″<<num<<endl; //合法 cout<<″name: ″<<name<<endl; cout<<″sex: ″<<sex<<endl; cout<<″age: ″<<age<<endl; cout<<″address: ″<<addr<<endl; }
int age; string addr; };
public继承
• main函数改为(假设对象stud中已有数据):
int main( ) {Student1 stud; //定义派生类Student1的对象stud
┆ //派生类对象调用基类公用成员函数 stud.display( );
//派生类对象调用派生类公用成员函数 stud.display_1(); return 0; }
private继承
•不能通过派生类对象引用从私有基类继承 过来的任何成员。 •派生类的成员函数不能访问私有基类的私 有成员,但可以访问私有基类的公用成员。
• 能否调用私有基类的公用成员函数,从 而引用私有基类的私有成员呢?
private继承
•将私有派生类的成员函数定义改写为
void display_1( ) {display(); //调用私有基类的公用成员函数
• 在派生类对象释放时,先执行派生类析构 函数,再执行其基类析构函数。
#include <iostream>
#include<string>
using namespace std;
class Student
//声明基类Student
{public:
Student(int n,string nam,char s)
继承
2012.3
How to do
• 画图 • 洗衣机 • 平面到三维?
继承(inheritance)
– 软件复用性 – 从现有类创建新类,称为派生
• 继承了现有类的属性和形式 • 使新类具有自己所需的功能
– 派生类(新类)( derived class )继承自 基类( base class )
private继承
• 用私有继承方式建立的派生类称为私有派生类 ,基类称 私有基类。
• 私有基类的私有成员,在私有派生类中不可访问。
• 私有基类的公用成员,在私有派生类中是私有的。
• 私有基类的保护成员,在私有派生类中是私有的
• 对于不需要再往下继承的类的功能,可用私有继承方式把
它隐蔽起来,这样下一层的派生类无法访问它。
public继承
• 用公用继承方式建立的派生类称为公用派生类,其 基类称为公用基类。
• 公用基类的私有成员,在公用派生类中不可访问。
• 公用基类的公用成员,在公用派生类中也是公用的。
• 公用基类的保护成员,在公用派生类中也是保护的。
public继承
• class Student1: public Student • {public: • void display_1( ) • {cout<<″ num: ″<<num<<endl; //错误 • cout<<″ name: ″<<name<<endl; //错误 • cout<<″ sex: ″<<sex<<endl; //错误 • cout<<″ age: ″<<age<<endl; • cout<<″ address: ″<<addr<<endl;} • private: • int age; • string addr; • };
int main( ) {Student1 stud1; stud1.display1( ); stud1.num=10023; return 0;
//错误
多级派生
• 类A为基类,类B是类A的派生类, 类C是类B派生类,则类C也是类 A的派生类。
• 类B称为类A的直接派生类,类C 称为类A间接派生类。类A是类B 的直接基类,是类C的间接基类。
{public:
void display_1( )
//新增成员函数
{cout<<″age: ″<<age<<endl;
cout<<″address: ″<<addr<<endl;}
private: int age;
class Student { public:
string addr; };
void display( ); private:
• 由protected声明的成员称为“保护成员”。 保护成员可被派生类的成员函数引用。
protected继承
• 在定义派生类时将基类的继承方式指定为 protected,称为保护继承,建立的派生类称为 保护派生类,其基类称保护基类。
• 保护基类的私有成员,在保护派生类中不可访问。
• 保护基类的公用成员,在保护派生类中是保护的。
构函数。
由派生引发的访问问题
(1) 基类的成员函数访问基类成员? (2) 派生类的成员函数访问派生类自己增加的成员? (3) 基类的成员函数访问派生类的成员? (4)在派生类外访问派生类的成员? (5) 派生类的成员函数访问基类的成员? (6) 在派生类外访问基类的成员?
– 如何确定基类成员在派生类中的访问属性?
//基类构造函
{num=n;
name=nam;
sex=s; }
~Student( ){ }
//基类析构函数
protected:
//保护部分
int num;
string name;
char sex ;
};
class Student1: public Student
{public:
Student1(int n,string nam,char s,int a,string ad)
public继承
• 可以将派生类Student1的声明改为
class Student1: public Student {public:
void display_1( ) {cout<<″ age: ″<<age<<endl;
cout<<″ address: ″<<addr<<endl;} private:
char sex;
};
void Student::display( )
//定义基类成员函数
{cout<<″num: ″<<num<<endl;
cout<<″name: ″<<name<<endl;
cout<<″sex: ″<<sex<<endl;
}
class Student1: protected Student {public:
• 派生类继承了基类的行为,并适当调整 • 添加了额外的数据成员和成员函数
继承(inheritance)
派生类是基类的具体化,而基类则是派生类的抽象。
继承(inheritance)
– 单一继承
• 从一个基类派生出来
– 多重继承
• 从多个基类派生出来,这些基类之间可能毫无联系
继承(inheritance)
cout<<″age: ″<<age<<endl; cout<<″address: ″<<addr<<endl;}
•main函数可改写为
int main( ) {Student1 stud1;
stud1.display_1( ); return 0; }
•由于私有派生类限制太多,不常使用。
protected继承
继承继承inheritanceinheritance单一继承?从一个基类派生出来多重继承?从多个基类派生出来这些基类之间可能毫无联系从多个基类派生出来这些基类之间可能毫无联系继承继承inheritanceinheritance?三种继承public?派生类的对象也是基类的对象基类的对象不是派生类的对象?派生类可以访问基类的非private成员继承继承inheritanceinheritanceprivate?用于复合protected?很少使用派生类的声明派生类的声明声明派生类的一般形护成员,在保护派生类中是保护的。
#include <iostream>
#include <string>
using namespace std;
class Student
//声明基类
{public:
void display( );
protected :
int num;
string name;
:Student(n,nam,s)
{age=a;
//对派生类新增的数据成员初始化
addr=ad;
}
void show( )
{cout<<″num: ″<<num<<endl;
cout<<″name: ″<<name<<endl;
cout<<″sex: ″<<sex<<endl;
cout<<″age: ″<<age<<endl;
Circle Square Triangle
Sphere
Cube Tetrahedron
class TwoDimensionalShape : public Shape
Point/circle派生层次: Point(x-y 坐标对) Circle(x-y 坐标对,Radius半径)
#ifndef POINT_H
cout<<″address: ″<<addr<<endl<<endl;
}
~Student1( ){ }
private:
int age;
string addr;
int main( ) {Student1 stud1(10010,″Wang-li″,′f′,19,
″115 Beijing Road,Shanghai″); Student1 stud2(10011,″Zhang-fun″,′m′,21,
class A {public:
int i; protected:
void f2( ); int j; private: int k; };
//基类
class B: public A {public:
void f3( ); protected:
void f4( ); private:
int m; }; class C: protected B {public:
• 三种继承
– public
• 派生类的对象也是基类的对象
– 基类的对象不是派生类的对象
• 派生类可以访问基类的非private成员
– private
• 用于复合
– protected
• 很少使用
派生类的声明
声明派生类的一般形式为 class 派生类名: [继承方式] 基类名 { 派生类新增加的成员 };
″213 Shanghai Road,Beijing″); stud1.show( ); stud2.show( ); return 0; } 运行结果为
num:10010 name:Wang-li sex:f address: 115 Beijing Road,Shanghai num:10011 name:Zhang-fun sex:m address: 213 Shanghai Road,Beijing
void f5( ); private:
int n; };
//public方式 //protected方式
类A是类B的公用基类,类B是类C的保护基类。
i
f2 j
k f3 f4 m f5 n
基类A 公 保 保 私 用护护有
公用 公 保 保 不可 公 保 私 派生类 用 护 护 访问 用 护 有
B
保护 保 保 保 不可 保 保 不可 公 私 派生类 护 护 护 访问 护 护 访问 用 有
C
派生类的构造函数和析构函数
– 在执行派生类的构造函数时,调用基类的构造 函数。
• 派生类构造函数一般形式为 派生类构造函数名(总参数表列)
: 基类构造函数名(参数表列) {派生类中新增数据成员初始化语句}
• 在建立一个对象时,执行构造函数的顺序 是: ①派生类构造函数先调用基类构造函数; ②再执行派生类构造函数本身。
int num;
string name;
char sex;
};
• 构成
• 构造一个派生类包括以下3部分工作:
(1) 从基类接收全部成员(不包括构造函数和析构函数) 。 (2) 调整从基类接收的成员。 (3) 在声明派生类时增加成员,扩展基类功能。 • 在声明派生类时,还应当自己定义派生类的构造函数和析
小结
• 继承体现了软件重用的思想 • 继承和复合的区别 • 继承有层次
–层次关系: 树状层次结构 –每个类可以看作:
• 基类
–提供 数据/行为 给其他类
• 派生类
–从其它类 继承 数据/行为
实例 Shape类的部分继承结构
Shape
TwoDimensionalShape
ThreeDimensionalShape
• 默认为private(私有的)
派生类的声明
假设已声明了一个基类Student,通过单继承建立一个派生类 Student1:
class Student1: public Student //声明基类是Studen
void display1( ); private:
int age; string addr; };
void Student1::display1( ) {cout<<″num: ″<<num<<endl; //合法 cout<<″name: ″<<name<<endl; cout<<″sex: ″<<sex<<endl; cout<<″age: ″<<age<<endl; cout<<″address: ″<<addr<<endl; }
int age; string addr; };
public继承
• main函数改为(假设对象stud中已有数据):
int main( ) {Student1 stud; //定义派生类Student1的对象stud
┆ //派生类对象调用基类公用成员函数 stud.display( );
//派生类对象调用派生类公用成员函数 stud.display_1(); return 0; }
private继承
•不能通过派生类对象引用从私有基类继承 过来的任何成员。 •派生类的成员函数不能访问私有基类的私 有成员,但可以访问私有基类的公用成员。
• 能否调用私有基类的公用成员函数,从 而引用私有基类的私有成员呢?
private继承
•将私有派生类的成员函数定义改写为
void display_1( ) {display(); //调用私有基类的公用成员函数
• 在派生类对象释放时,先执行派生类析构 函数,再执行其基类析构函数。
#include <iostream>
#include<string>
using namespace std;
class Student
//声明基类Student
{public:
Student(int n,string nam,char s)
继承
2012.3
How to do
• 画图 • 洗衣机 • 平面到三维?
继承(inheritance)
– 软件复用性 – 从现有类创建新类,称为派生
• 继承了现有类的属性和形式 • 使新类具有自己所需的功能
– 派生类(新类)( derived class )继承自 基类( base class )
private继承
• 用私有继承方式建立的派生类称为私有派生类 ,基类称 私有基类。
• 私有基类的私有成员,在私有派生类中不可访问。
• 私有基类的公用成员,在私有派生类中是私有的。
• 私有基类的保护成员,在私有派生类中是私有的
• 对于不需要再往下继承的类的功能,可用私有继承方式把
它隐蔽起来,这样下一层的派生类无法访问它。
public继承
• 用公用继承方式建立的派生类称为公用派生类,其 基类称为公用基类。
• 公用基类的私有成员,在公用派生类中不可访问。
• 公用基类的公用成员,在公用派生类中也是公用的。
• 公用基类的保护成员,在公用派生类中也是保护的。
public继承
• class Student1: public Student • {public: • void display_1( ) • {cout<<″ num: ″<<num<<endl; //错误 • cout<<″ name: ″<<name<<endl; //错误 • cout<<″ sex: ″<<sex<<endl; //错误 • cout<<″ age: ″<<age<<endl; • cout<<″ address: ″<<addr<<endl;} • private: • int age; • string addr; • };
int main( ) {Student1 stud1; stud1.display1( ); stud1.num=10023; return 0;
//错误
多级派生
• 类A为基类,类B是类A的派生类, 类C是类B派生类,则类C也是类 A的派生类。
• 类B称为类A的直接派生类,类C 称为类A间接派生类。类A是类B 的直接基类,是类C的间接基类。
{public:
void display_1( )
//新增成员函数
{cout<<″age: ″<<age<<endl;
cout<<″address: ″<<addr<<endl;}
private: int age;
class Student { public:
string addr; };
void display( ); private:
• 由protected声明的成员称为“保护成员”。 保护成员可被派生类的成员函数引用。
protected继承
• 在定义派生类时将基类的继承方式指定为 protected,称为保护继承,建立的派生类称为 保护派生类,其基类称保护基类。
• 保护基类的私有成员,在保护派生类中不可访问。
• 保护基类的公用成员,在保护派生类中是保护的。
构函数。
由派生引发的访问问题
(1) 基类的成员函数访问基类成员? (2) 派生类的成员函数访问派生类自己增加的成员? (3) 基类的成员函数访问派生类的成员? (4)在派生类外访问派生类的成员? (5) 派生类的成员函数访问基类的成员? (6) 在派生类外访问基类的成员?
– 如何确定基类成员在派生类中的访问属性?
//基类构造函
{num=n;
name=nam;
sex=s; }
~Student( ){ }
//基类析构函数
protected:
//保护部分
int num;
string name;
char sex ;
};
class Student1: public Student
{public:
Student1(int n,string nam,char s,int a,string ad)
public继承
• 可以将派生类Student1的声明改为
class Student1: public Student {public:
void display_1( ) {cout<<″ age: ″<<age<<endl;
cout<<″ address: ″<<addr<<endl;} private:
char sex;
};
void Student::display( )
//定义基类成员函数
{cout<<″num: ″<<num<<endl;
cout<<″name: ″<<name<<endl;
cout<<″sex: ″<<sex<<endl;
}
class Student1: protected Student {public:
• 派生类继承了基类的行为,并适当调整 • 添加了额外的数据成员和成员函数
继承(inheritance)
派生类是基类的具体化,而基类则是派生类的抽象。
继承(inheritance)
– 单一继承
• 从一个基类派生出来
– 多重继承
• 从多个基类派生出来,这些基类之间可能毫无联系
继承(inheritance)
cout<<″age: ″<<age<<endl; cout<<″address: ″<<addr<<endl;}
•main函数可改写为
int main( ) {Student1 stud1;
stud1.display_1( ); return 0; }
•由于私有派生类限制太多,不常使用。
protected继承
继承继承inheritanceinheritance单一继承?从一个基类派生出来多重继承?从多个基类派生出来这些基类之间可能毫无联系从多个基类派生出来这些基类之间可能毫无联系继承继承inheritanceinheritance?三种继承public?派生类的对象也是基类的对象基类的对象不是派生类的对象?派生类可以访问基类的非private成员继承继承inheritanceinheritanceprivate?用于复合protected?很少使用派生类的声明派生类的声明声明派生类的一般形护成员,在保护派生类中是保护的。
#include <iostream>
#include <string>
using namespace std;
class Student
//声明基类
{public:
void display( );
protected :
int num;
string name;
:Student(n,nam,s)
{age=a;
//对派生类新增的数据成员初始化
addr=ad;
}
void show( )
{cout<<″num: ″<<num<<endl;
cout<<″name: ″<<name<<endl;
cout<<″sex: ″<<sex<<endl;
cout<<″age: ″<<age<<endl;
Circle Square Triangle
Sphere
Cube Tetrahedron
class TwoDimensionalShape : public Shape
Point/circle派生层次: Point(x-y 坐标对) Circle(x-y 坐标对,Radius半径)
#ifndef POINT_H
cout<<″address: ″<<addr<<endl<<endl;
}
~Student1( ){ }
private:
int age;
string addr;
int main( ) {Student1 stud1(10010,″Wang-li″,′f′,19,
″115 Beijing Road,Shanghai″); Student1 stud2(10011,″Zhang-fun″,′m′,21,
class A {public:
int i; protected:
void f2( ); int j; private: int k; };
//基类
class B: public A {public:
void f3( ); protected:
void f4( ); private:
int m; }; class C: protected B {public:
• 三种继承
– public
• 派生类的对象也是基类的对象
– 基类的对象不是派生类的对象
• 派生类可以访问基类的非private成员
– private
• 用于复合
– protected
• 很少使用
派生类的声明
声明派生类的一般形式为 class 派生类名: [继承方式] 基类名 { 派生类新增加的成员 };
″213 Shanghai Road,Beijing″); stud1.show( ); stud2.show( ); return 0; } 运行结果为
num:10010 name:Wang-li sex:f address: 115 Beijing Road,Shanghai num:10011 name:Zhang-fun sex:m address: 213 Shanghai Road,Beijing
void f5( ); private:
int n; };
//public方式 //protected方式
类A是类B的公用基类,类B是类C的保护基类。
i
f2 j
k f3 f4 m f5 n
基类A 公 保 保 私 用护护有
公用 公 保 保 不可 公 保 私 派生类 用 护 护 访问 用 护 有
B
保护 保 保 保 不可 保 保 不可 公 私 派生类 护 护 护 访问 护 护 访问 用 有
C
派生类的构造函数和析构函数
– 在执行派生类的构造函数时,调用基类的构造 函数。
• 派生类构造函数一般形式为 派生类构造函数名(总参数表列)
: 基类构造函数名(参数表列) {派生类中新增数据成员初始化语句}
• 在建立一个对象时,执行构造函数的顺序 是: ①派生类构造函数先调用基类构造函数; ②再执行派生类构造函数本身。
int num;
string name;
char sex;
};
• 构成
• 构造一个派生类包括以下3部分工作:
(1) 从基类接收全部成员(不包括构造函数和析构函数) 。 (2) 调整从基类接收的成员。 (3) 在声明派生类时增加成员,扩展基类功能。 • 在声明派生类时,还应当自己定义派生类的构造函数和析
小结
• 继承体现了软件重用的思想 • 继承和复合的区别 • 继承有层次
–层次关系: 树状层次结构 –每个类可以看作:
• 基类
–提供 数据/行为 给其他类
• 派生类
–从其它类 继承 数据/行为
实例 Shape类的部分继承结构
Shape
TwoDimensionalShape
ThreeDimensionalShape