继承与多态 PPT
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int nType; CBug( int legs, int color ); void PrintBug () { }; }; class CFlyBug: public CBug { // FlyBug是Bug的派生类 int nWings; public: CFlyBug( int legs, int color, int wings ); };
int main()
{
CFlyBug fb( 2,3,4);
fb.PrintBug();
fb.nType = 1;
fb.nLegs = 2 ; // error.nLegs is private
return 0;
}
FlyBug fb ( 2,3,4);
在 创建 派生类的对象 时,
•需要调用 基类的构造函数:
P1: (1, 2) P2: (1, 2, 3)
继承
▪ 派生类对象包含基类对象,所以在建立派生 类的实例对象时,必须初始化基类继承的数 据成员。派生类对象析构时,也必须析构基 类对象。
▪ 派生类不继承基类的构造函数、析构函数和 赋值运算符,但是派生类的构造函数、析构 函数和赋值运算符能调用基类的构造函数、 析构函数和赋值运算符。
大家学习辛苦了,还是要坚持
继续保持安静
继承实例
class point_3d : public point_2d
{ int z;
public:
point_3d( int x0=0, int y0=0, int z0=0) :
point_2d( x0, y0 ) { z = z0; }
void setpoint3( int a, int b, int c )
派生类的构造函数和析构函数
派生类对象 包含 基类对象 执行派生类构造函数之前, 先执行基类的构
造函数 派生类交代基类初始化, 具体形式: 构造函数名(形参表): 基类名(基类构造函数实
参表) { }
派生类的构造函数
class CBug { private :
int nLegs; int nColor; public:
x,y。 有两个成员函数:
{ int y;
setx和sety
public:
void sety( int k );
};
派生类对基类成员的访问 主流派生方式是public
派生类对基类成员的访问
class CP1 { private:
int x; public:
voห้องสมุดไป่ตู้d setx( int k ); } class CP2 : public CP1 {
初始化派生类对象中从基类继承的成员
•在执行一个派生类的构造函数之前,
总是先执行基类的构造函数
调用基类构造函数的两种方式 •显式方式: 派生类的构造函数中 基类的构造函数提供参数
derived::derived( arg_derived-list ) :
派生类的构造函数和析构函数
▪ 派生类的内存布局 ▪ class point_2d {}; ▪ class point_3d : public point_2d{};
基类像楼房的第一层 派生类像楼房的高层
派生类的构造函数和析构函数
建楼房时,先盖第一层,再盖第二层 构造执行顺序 拆楼房时,先拆第顶层,逐次往下拆 析构执行顺序
CBug::CBug( int legs, int color) {
nLegs = legs; nColor = color; } //错误的FlyBug构造函数: CFlyBug::CFlyBug( int legs, int color, int wings ) { nLegs = legs; // 不能访问 nColor = color; // 不能访问 nType = 1; // ok nWings = wings; } //正确的FlyBug构造函数: CFlyBug::CFlyBug( int legs, int color, int wings ) : CBug( legs, color ) { nWings = wings; }
int y; public:
void sety( int k ); }
继承实例
class point_2d { private:
int x, y; public:
point_2d ( int x0=0, int y0=0 ) { x=x0; y=y0; } void setpoint2( int a, int b ) { x = a; y = b; } int getx() { return x; } int gety() { return y; } };
06 继承与多态
组合
组合就是把用户定义类的对象作为新 类的数据成员 组合体现的思想?
class CPoint {
int x; int y; };
class CCircle {
CPoint p; double r; };
继承
继承体现的思想?
基类(父类) 派生类(子类)
一个新类从已有的类那里获得其 已有特性,称为类的继承。
cout << "p1: (" << p1.getx() << ", " << p1.gety() << ")" << endl;
p2.setpoint3(1, 2, 3);
cout << "p2: (" << p2.getx() << ", " << p2.gety() << ", "
<< p2.getz() << ")" << endl; return 0; }
{ setpoint2( a, b ); z=c; }
int getz() { return z; }
};
point_3d的组成 point_3d类的使用和普
访问基类
通类完全一样
int main() {point_2d p1; point_3d p2;
继承实例
p1.setpoint2(1, 2);
派生
▪ 单继承 ▪ 基类成员在派生类中的访问特性 ▪ 派生类对象的构造、析构与赋值操作 ▪ 重定义基类的函数 ▪ 派生类作为基类 ▪ 将派生类对象隐式转换为基类对象
单继承
class CP1
{
int x; public:
CP2有两个数据成员:
void setx( int k ); }; class CP2 : public CP1
int main()
{
CFlyBug fb( 2,3,4);
fb.PrintBug();
fb.nType = 1;
fb.nLegs = 2 ; // error.nLegs is private
return 0;
}
FlyBug fb ( 2,3,4);
在 创建 派生类的对象 时,
•需要调用 基类的构造函数:
P1: (1, 2) P2: (1, 2, 3)
继承
▪ 派生类对象包含基类对象,所以在建立派生 类的实例对象时,必须初始化基类继承的数 据成员。派生类对象析构时,也必须析构基 类对象。
▪ 派生类不继承基类的构造函数、析构函数和 赋值运算符,但是派生类的构造函数、析构 函数和赋值运算符能调用基类的构造函数、 析构函数和赋值运算符。
大家学习辛苦了,还是要坚持
继续保持安静
继承实例
class point_3d : public point_2d
{ int z;
public:
point_3d( int x0=0, int y0=0, int z0=0) :
point_2d( x0, y0 ) { z = z0; }
void setpoint3( int a, int b, int c )
派生类的构造函数和析构函数
派生类对象 包含 基类对象 执行派生类构造函数之前, 先执行基类的构
造函数 派生类交代基类初始化, 具体形式: 构造函数名(形参表): 基类名(基类构造函数实
参表) { }
派生类的构造函数
class CBug { private :
int nLegs; int nColor; public:
x,y。 有两个成员函数:
{ int y;
setx和sety
public:
void sety( int k );
};
派生类对基类成员的访问 主流派生方式是public
派生类对基类成员的访问
class CP1 { private:
int x; public:
voห้องสมุดไป่ตู้d setx( int k ); } class CP2 : public CP1 {
初始化派生类对象中从基类继承的成员
•在执行一个派生类的构造函数之前,
总是先执行基类的构造函数
调用基类构造函数的两种方式 •显式方式: 派生类的构造函数中 基类的构造函数提供参数
derived::derived( arg_derived-list ) :
派生类的构造函数和析构函数
▪ 派生类的内存布局 ▪ class point_2d {}; ▪ class point_3d : public point_2d{};
基类像楼房的第一层 派生类像楼房的高层
派生类的构造函数和析构函数
建楼房时,先盖第一层,再盖第二层 构造执行顺序 拆楼房时,先拆第顶层,逐次往下拆 析构执行顺序
CBug::CBug( int legs, int color) {
nLegs = legs; nColor = color; } //错误的FlyBug构造函数: CFlyBug::CFlyBug( int legs, int color, int wings ) { nLegs = legs; // 不能访问 nColor = color; // 不能访问 nType = 1; // ok nWings = wings; } //正确的FlyBug构造函数: CFlyBug::CFlyBug( int legs, int color, int wings ) : CBug( legs, color ) { nWings = wings; }
int y; public:
void sety( int k ); }
继承实例
class point_2d { private:
int x, y; public:
point_2d ( int x0=0, int y0=0 ) { x=x0; y=y0; } void setpoint2( int a, int b ) { x = a; y = b; } int getx() { return x; } int gety() { return y; } };
06 继承与多态
组合
组合就是把用户定义类的对象作为新 类的数据成员 组合体现的思想?
class CPoint {
int x; int y; };
class CCircle {
CPoint p; double r; };
继承
继承体现的思想?
基类(父类) 派生类(子类)
一个新类从已有的类那里获得其 已有特性,称为类的继承。
cout << "p1: (" << p1.getx() << ", " << p1.gety() << ")" << endl;
p2.setpoint3(1, 2, 3);
cout << "p2: (" << p2.getx() << ", " << p2.gety() << ", "
<< p2.getz() << ")" << endl; return 0; }
{ setpoint2( a, b ); z=c; }
int getz() { return z; }
};
point_3d的组成 point_3d类的使用和普
访问基类
通类完全一样
int main() {point_2d p1; point_3d p2;
继承实例
p1.setpoint2(1, 2);
派生
▪ 单继承 ▪ 基类成员在派生类中的访问特性 ▪ 派生类对象的构造、析构与赋值操作 ▪ 重定义基类的函数 ▪ 派生类作为基类 ▪ 将派生类对象隐式转换为基类对象
单继承
class CP1
{
int x; public:
CP2有两个数据成员:
void setx( int k ); }; class CP2 : public CP1