继承和派生类

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第十一章
(1)公有派生: 例:class CPerson { public: char name; CPerson(char a, int b, char c) { name=a; age=b; sex=c;} int getage() {return age;} char getsex() {return sex;} private: int age; protected:
Байду номын сангаас
第十一章
2. 多重继承:
继承和派生类
多重继承就是某一个派生类具有多个基类的继承。 在多重继承情况下,派生类将继承它的所有基类的各种成员,并且也可 以在派生类中通过成员声明来添加新的成员。 格式: class 派生类名 : 访问控制 基类名1, 访问控制 基类名2, … …, { 数据成员和成员函数声明 } 例: class A { int x ; public: class B { int y ; public: class C: public A, private B { int z ; public:
例: C c1; A a1; a1=c1 ; c1=a1;
第十一章
11.3 虚基类 例: 基类A 基类B 基类D 基类A 基类C
继承和派生类
产生二义性:类D中含有类A 的两个拷贝,可能造成数据的 不一致性
解决: 使公共的基类在派生类中只有一个拷贝,可以将这种基类说明为虚基类。 方法: 在派生类的定义中,在基类的类名前加关键字virtual , 该关键字仅对紧跟其 后的基类名起作用。
继承和派生类
class CStudent : public CPerson { int number; float grade; public: CStudent (char a, int b, char c, int d, float e) : CPerson(a, b, c)
{ number=d; grade=e; }
第十一章
(2)私有派生: 例: class CPerson { public:
继承和派生类
class CStudent : private CPerson { int number; float grade; public: CStudent (char a, int b, char c, int d, float e) : CPerson(a, b, c) { number=d; grade=e; } void show( ) {cout<<name<<sex<<getage(); cout<<number<<grade; } };
CStudent Tom(‘A’, 18, ‘M’, 1, 85.5); Tom.show( ); cout<<Tom.name; //基类中的公有成员可在类外直接使用;
cout<<Tom.getsex( ); //基类中的保护成员在类外不可直接使用; }; 说明: 若在派生类中包含对象成员,则在派生类的构造函数的初始化成员列表中 还要列举调用的对象成员的构造函数。
支配规则: C++允许派生类中新增加的成员名与其基类的成员名相同,当 没有使用作用域运算符时,派生类中定义的成员名优于基类中的成员名, 这种优先关系称为~。
第十一章
(3)赋值兼容规则 例: class A {public: int x ; A( int a) {x=a; } }; class B { public: int y ; B( int b) { y=b; } };
第十一章
例: class A {public: int x ; A( int a) {x=a; } };
继承和派生类
class C:public A
virtual public A
class B:public A { public: int y ; B( int a, int b) :A(a) { y=b; } };
第十一章
主程序中调用:
继承和派生类
系统首先调用基类的构造函数,对基类成员进行初始化,然 void main(void) 后执行派生类的构造函数。 CStudent(char a,int b,char c,int d,float e):CPerson(a, b, c)
{
{ number=d; grade=e; }
void show( ) {cout<<name<<sex<<getage(); cout<<number<<grade; } };
char sex; } ;
• 基类中说明为public的成员,在派生类中仍保持public属性; • 基类中说明为private的成员,在派生类中不可直接使用; • 基类中说明为protected的成员, 在公有派生类中可直接使用,在类外不 可直接访问,必须通过派生类公有或保护的成员函数访问。
(2)定义共有成员函数3个:输出复数、置实部、置虚部; (3)要求从键盘输入复数的实部和虚部,调用成员函数来输出复数。
(4)定义三个构造函数: 无参数的构造函数,实部和虚部为0; 含一个参数的构造函数赋给实部,同时把虚部置为0; 含两个参数的构造函数分别把参数赋给实部和虚部。 (5)定义一个析构函数:完成打印结束信息的功能。
继承和派生类
class C:public A, public B { int z ; public: void setz( int c) { z=c; } };
赋值兼容规则: 同类型对象之间可以相互赋值
公有派生类的对象可赋给其基类的对象,系统将派生类对象中从对应基 类中继承的成员赋给基类对象,反之不允许。
virtual public A { int z ;
public: C(int a, int b): A(a) { z=b; } };
class D: public B,public C { public: int m; D(int a, int b , int c, int d , int e ): B(a, b), C(c, d) { m=e; } }
char name;
CPerson(char a, int b, char c) { name=a; age=b; sex=c;} int getage() {return age;} private: int age; protected: char sex;} ;
• 基类中公有成员和保护成员在派生类中均变为私有,在派生类中可直接 使用这些成员,在派生类外均不可直接使用基类中的公有或私有成员。 • 基类中的私有成员在派生类中同样不可直接使用。
第十一章
11.1 继 承
继承和派生类
在定义一个类A时,若它使用了一个已定义类B的部分或全部成员,则称 类A继承了类B,并称类B为基类或父类,称类A为派生类或子类。
可用此图表示继承的关系:
类 B 类 A
单一继承:当一个派生类仅由一个基类派生时,称为单一继承;
多重继承:当一个派生类由两个或更多个基类派生时,称为多重继承。 例如: 学生 大学生 职工 学生
注意:作用域运算符不允许嵌套使用,如:A::C::x
第十一章
(2)支配规则 例: class A {public: int x ; A( int a) {x=a; } }; class B { public: int y ; B( int b) { y=b; } };
继承和派生类
class C:public A, public B { int x ; public: void setx( int c) { x=c; } }; 若要给基类A中的x赋值, 必须使用A::x=c;
A(int a) {x=a;}
};
B(int b) {y=b;}
};
C(int a,int b, int c):A(a),B(b)
{ z=c ; } };
第十一章
11 . 2 冲突、支配规则和赋值兼容性 (1)冲突 例: class A {public: int x ; A( int a) {x=a; } }; class B { public: int x ; B( int b) { x=b; } };
继承和派生类
class C:public A, public B { int y ; public: void setx( int c) { x=c; } }; A::x=c; 或 B::x=c;
冲突:当一个公有的派生类由两个或多个基类派生,当基类中成员的访问 权限为public,且不同基类中的成员具有相同的名字时,出现重名,称为~。 解决方法: 使用作用域运算符(类名 ::成员名)来限定所访问成员是属于哪一个基类 的。
系统约定执行类B和类C的构造函数时都不调用虚基类A的构 造函数,在类D的构造函数中直接调用类A的构造函数。D(int a, int b, int c, int d, int e): :B(a, b), C(c, d),A(50)
第十一章
作业: 1、定义一个描述复数的类。
继承和派生类
要求:(1)私有数据成员为浮点数表示的实部和虚部;
在职学生
单一继承
多重继承
第十一章
1. 单一继承
继承和派生类
格式: class 派生类名称 :访问控制 基类名称 { 数据成员和成员函数声明 //派生类新增加的 }; 访问控制:规定基类中的成员在派生类中的访问权限。 public : 公有派生,基类中所有成员在公有派生类中各个成员的访问权限不变; private: 私有派生,基类中公有成员和保护成员在派生类中变为私有,基类中 的私有成员在派生类中不可直接使用。(为缺省值) protected:保护派生。 继承的目的在于为代码重用提供有效手段。 通过继承,派生类具有了在基类中声明的数据结构和操作,同时,通过 “数据成员和成员函数声明”,派生类还可以定义基类中所没有的数据结 构和操作,以此来很快地定义新类。
第十一章
(3)抽象类
继承和派生类
抽象类: 若定义了一个类,该类只能用作基类来派生出新的类,而不能用作 定义对象,该类称为抽象类。 定义方法: 把类的构造函数或析构函数的访问权限定义为保护的
原因:
因为基类中的保护成员在派生类中可像公有成员一样调用,因此当用抽象 类作为基类产生派生类时,在派生类中可调用其基类的构造函数,而在派生 类外是不允许直接调用的。
相关文档
最新文档