C++基类和派生类
2011春 浙大远程 面向对象程序设计 在线答案

B 派生类还可以再作为另一派生类的基类
C 从派生类到基类称为派生
D 从派生类到基类称为继承
正确答案:C
18.关于抽象类的下列描述中,错误的是
A 如果一个类至少有一个纯虚函数,那么该类为抽象类
B 抽象类只能用作其他类的基类,不能建立抽象类对象
C 抽象类可以用来定义指针
C 构造函数
D 友员函数
正确答案:C
14.不是构造函数的特征是
A 构造函数与类同名
B 构造函数必须说明返回类型
C 构造函数可以有形式参数
D 编译系统会自动调用构造函数
正确答案:B
15.是构造函数的特征是
A 构造函数不能与类同名
B 构造函数必须说明返回类型
A 必须有一个关键字,以示区别
B 每个对象必须有一个名字
C 有属性
D 有操作
正确答案:A
52.不是面向对象系统的特性是
A 封装性
B 继承性
C 保密性
D 多态性
正确答案:C
53.类的概念是
A 所有对象的集合
B 同一类记录的集合
C 同一类数据的集合
D 所有对象的集合
正确答案:A
7.打开磁盘文件的打开方式中,以写方式打开文件为
A ios::ate
B ios::out
C ios::in
D ios::app
正确答案:B
8.在面向对象的程序设计中,定义类时保留字是用
A type
B class
C private
C 构造函数可以有形式参数
D 程序中必须有调用构造函数的语句
C++派生类与基类对象赋值情况

C++派⽣类与基类对象赋值情况⼀、普通赋值 (同名隐藏)
⼦类对象调⽤和⽗类相同的函数名,该⽗类的函数名会被隐藏,只会调⽤⼦类的函数。
Class A
{
public:
void show();
void show(int);
}
Class B : public A
{
public :
void show();
void printf();
}
int main()
{
B b;
b.show();
a.show(); //这时候⼦类已经隐藏⽗类的⽅法,⽗类不能在调⽤⾃⼰的函数
a.show(0) //同上
}
⽗类的引⽤或指针被⼦类对象的对象或地址赋值后,它会调⽤⽗类⾃⼰相应的⽅法
⼆、⼦类对象地址给⽗类指针赋值
通过⼦类的对象的地址给⽗类的指针赋值----->⽗类指针只能调⽤⼦类中从⽗类继承的函数或者变量
int main()
{
A * a ;
B b;
a = &b;
a->show();
a->printf(); //这个是错误的调⽤,不能调⽤⼦类的函数⽅法
}
三、⼦类对象给⽗类的引⽤赋值
⽗类的引⽤只能访问由⼦类继承⽗类的函数或者变量
int main()
{
A &a;
B b;
a = b;
a.show();
a.list(); //这个引⽤是错误的 }。
c#学习第6章精品PPT课件

• 2.析构函数
• 当对象被删除时,派生类的析构函数被执行。 由于析构函数也不能被继承,因此在执行派生类 的析构函数时,基类的析构函数也将被调用。
• 执行顺序是:
① 执行派生类的析构函数 ② 执行基类的析构函数
其顺序与 执行构造 函数时的 顺序正好
相反
class Student { public static string sDepartment = "软件工程系
//定义公有成员方法,成员变量SName,Sex,sClassName由父类继承而来 public void WriteCStudentInfo() { Console.Write("{0},{1},{2},{3},", SName, Sex, Department, sClassName);
//此成员方法来自父类 WriteAge(); } }
Student
class Student
//定义一般学生类,父类
{
public static string sClassName = "软件一班";//静态字段
public string SName = "王丽";
//公有字段
private int Age = 21;
//私有字段,不被继承
protected string Sex="女";
第6章 面向对象编程进阶
本章要点
通过本章的学习,使读者:
• 理解基类和派生类的概念,理解继承是如何提高软件可重 用性的
• 熟练掌握派生类的定义方法和应用 • 掌握接口概念和实现方法,能够用接口技术实现多继承功 能 • 了解委托和事件的概念、声明方法和应用 • 了解并掌握异常处理方法
基类和派生类

5
(1)公有继承(public)
当类的继承方式为公有继承时,基类的公有和保 护成员的访问属性在派生类中不变,而基类的私有 成员不可访问,
即基类的公有成员和保护成员被继承到派生类中 仍作为派生类的公有成员和保护成员,派生类的其 他成员可以直接访问它们。
具体赋值规则如下: 派生类的对象可以赋值给基类对象。 派生类的对象可以初始化基类对象的引用。 派生类对象的地址可以赋给指向基类对象的 指针。
15
例如: class A{...};
class B: public A
{void fun() {...}}; A a; B b; a=b; //将对象b中所含类A成员的值赋给对象a A &a1=b; //用派生类对象初始化基类对象的引用 A *pa =&b;
22
基类名1,继承方式2 基类名2,… {…} ;
{ 派生类类体
class C : public
};
A , private B
多重继承允许一个派生类同时继 {…} ; // C 公有
承多个基类中的成员,支持了软件 继承 A,私有继
的重用性,但也可能带来大量的二 承 B
义性问题。 17
复合与继承在软件渐增式开发中的应用
10
3.在派生类中重定义基类的函数
派生类自动继承了基类中定义的数据成员和成员函数。 如果派生类认为基类中某个成员函数的实现不能满足需 要,可以在派生类中重新定义该函数。
重定义基类的成员函数需要使用和该函数相同的函数 名和参数列表,如果参数列表不同,就是函数重载而不 是函数的重定义了。
C 课后习题答案第七章

C++作业答案第7章继承7.1 选择题1.在c++中,类与类之间的继承关系具有( c )。
(a) 自反性 (b) 对称性 (c) 传递性 (d) 反对称性2.下列关于类的继承描述中,( a,b )是错误的。
(a) 派生类可以访问基类的所有数据成员,调用基类的所有成员函数(b) 派生类也是基类,所以基类具有派生类的全部属性和方法(c) 继承描述类的层次关系,派生类可以具有与基类相同的属性和方法(d) 一个基类可以有多个派生类,一个派生类可以有多个基类3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( a )。
(a) public 成员 (b)private成员(c) protected成员 (d)友员4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( b )。
(a) public 成员 (b)private成员(c) protected成员 (d)友员5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( c )。
(a) public 成员 (b)private成员(c) protected成员 (d)友员6.不论派生类以何种方式继承基类,都不能使用基类的( b )。
(a) public 成员 (b)private成员(c) protected成员 (d)public 成员和protected成员7.下面描述中,错误的是( b, c )。
(a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问(b) 在基类定义的public和protected成员在私有继承的派生类中可见,在类外可以被访问(c) 在基类定义的public和protected成员在保护继承的派生类中不可见(d) 在派生类中不可见的成员要变成可访问的需进行访问声明8.在c++中,不能被派生类继承的函数是( b,c )。
(a) 成员函数 (b)构造函数(c) 析构函数 (d)静态成员函数9.在创建派生类对象时,构造函数的执行顺序是( d )。
C++基类和派生类

C++基类和派⽣类整理⾃ 通过继承机制,可以利⽤已有的数据类型来定义新的数据类型。
所定义的新的数据类型不仅拥有新定义的成员,⽽且还同时拥有旧的成员。
我们称已存在的⽤来派⽣新类的类为基类,⼜称为⽗类。
由已存在的类派⽣出的新类称为派⽣类,⼜称为⼦类。
在++中,⼀个派⽣类可以从⼀个基类派⽣,也可以从多个基类派⽣。
从⼀个基类派⽣的继承称为单继承;从多个基类派⽣的继承称为多继承。
派⽣类的定义格式 单继承的定义格式如下: class <派⽣类名>:<继承⽅式><基类名> { <派⽣类新定义成员> }; 其中,<派⽣类名>是新定义的⼀个类的名字,它是从<基类名>中派⽣的,并且按指定的<继承⽅式>派⽣的。
<继承⽅式>常使⽤如下三种关键字给予表⽰: public 表⽰公有基类; private 表⽰私有基类; protected 表⽰保护基类; 多继承的定义格式如下: class <派⽣类名>:<继承⽅式1><基类名1>,<继承⽅式2><基类名2>,… { <派⽣类新定义成员> }; 可见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于⼀个。
派⽣类的三种继承⽅式 公有继承(public)、私有继承(private)、保护继承(protected)是常⽤的三种继承⽅式。
1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派⽣类的成员时,它们都保持原有的状态,⽽基类的私有成员仍然是私有的。
2. 私有继承(private) 私有继承的特点是基类的公有成员和保护成员都作为派⽣类的私有成员,并且不能被这个派⽣类的⼦类所访问。
3. 保护继承(protected) 保护继承的特点是基类的所有公有成员和保护成员都成为派⽣类的保护成员,并且只能被它的派⽣类成员函数或友元访问,基类的私有成员仍然是私有的。
C++中三种继承方式的区别

C++中三种继承⽅式的区别还可参考另⼀篇⽂章:public公有继承protected保护继承private我们知道类的private和protected成员,在类外是不可以使⽤的.只有public成员可以在类外直接使⽤.公有继承时,基类的private成员派⽣类也不可⽤,基类的public和protected成员在派⽣类中可直接使⽤.继承过来(变成派⽣类相应的public和protected成员)只有public成员在派⽣类外可以直7a64e58685e5aeb931333262363034接使⽤.保护继承时,基类的private成员仍为有私有.基类的public和protected成员变成派⽣类的protected成员,这时在派⽣类外也不能直接使⽤原基类的public成员时,基类的private成员仍为有私有.基类的public和protected成员将变成派⽣类的private成员.举个例⼦.class A{public:int m_nTelNum;protected:int m_nAge;private:int m_nMoney;};class B:public A{void SetTelNum(int nTelNum){m_nTelNum=nTelNum;}void SetAge(int nAge){m_nAge=nAge;}void SetMoney(int nMoney){m_nMoney=nMoney;//这⾥就出现错误,因为基类的private成员不能⽤.};B objB;//创建B类的对象objBobjB.m_nTelNum=123456;//可以objB.m_nAge=30;//错误.public继承中基类的protected在派⽣类中是protectedobjB.m_nMoney=100;//更错误,在派⽣类中都不可以直接使⽤.在类外就更不能了.class C:protected A{void SetTelNum(int nTelNum){m_nTelNum=nTelNum;}void SetAge(int nAge){m_nAge=nAge;}void SetMoney(int nMoney){m_nMoney=nMoney;//这⾥就出现错误,因为这是基类的private成员不能⽤.}};C objC;//创建C类的对象objCobjC.m_nTelNum=123456;//注意这⾥和public的区别,这⾥错误,m_nTelNum变成了C类的protected成员objC.m_nAge=30;//错误.protected继承中基类的protected在派⽣类中是protected,这与public同相objC.m_nMoney=100;//更错误,在派⽣类中都不可以直接使⽤.在类外就更不能了.class D:private A{void SetTelNum(int nTelNum){m_nTelNum=nTelNum;}void SetAge(int nAge){m_nAge=nAge;void SetMoney(int nMoney){m_nMoney=nMoney;//这⾥就出现错误,因为这是基类的private成员不能⽤.}};D objD;//创建D类的对象objDobjD.m_nTelNum=123456;//错误,m_nTelNum变成了D类的private成员objD.m_nAge=30;//错误.private继承中基类的protected在派⽣类中是privateobjD.m_nMoney=100;//更错误,在派⽣类中都不可以直接使⽤.在类外就更不能了.从例⼦来看,三种继承从派⽣类内部引⽤来看好像没有区别,只在类外引⽤时表现不同.现在还看不出public和protected继承的区别那再看⼀个例⼦.class E:public B{void SetTelNum(int nTelNum){m_nTelNum=nTelNum;//可以因为这是B的公有成员}void SetAge(int nAge){m_nAge=nAge;//可以因为这是B的保护成员,现成变成E的protected成员}void SetMoney(int nMoney){m_nMoney=nMoney;//这个肯定不可以!}};E objE;//objE.m_nTelNum=123456;//可以//其它的两个就不能⽤了.class F:public C{void SetTelNum(int nTelNum)m_nTelNum=nTelNum;//可以因为这是C的保护成员,这⾥与public继承已经有区别但还没有表现出来 }void SetAge(int nAge){m_nAge=nAge;//可以因为这是C的保护成员,现成变成E的protected成员}void SetMoney(int nMoney){m_nMoney=nMoney;//这个肯定不可以!}};F objF;objF.m_nTel=123456;//错误,因为这是F的保护成员.注意与E类区别class G:public D{void SetTelNum(int nTelNum){m_nTelNum=nTelNum;//不可以因为这是D的private成员,注意这⾥区别}void SetAge(int nAge){m_nAge=nAge;//不可以因为这是D的private成员,注意区别}void SetMoney(int nMoney){m_nMoney=nMoney;//这个肯定不可以!}};//那G在类外就没有了可以引⽤的继承过来成员了!//这些继承⽅式是很难理解的.最好的办法就是多写代码去试.。
5.2 基类和派生类

5.2 基类和派生类在C++中,当一个类被其他类继承时,被继承的类称为基类(base class)。
继承其他类特性的类称为派生类(derived class)。
从本质上看,基类是具有一个类集合中的公共特性,派生类在继承基类特性的同时可以加入自己独有的特性。
基类与派生类之间反映出下述三种不同的现象:(1)派生类是基类的具体化。
即模拟概念层次,表示“is-a”的关系。
(2)派生类是基类的延迟定义。
可以定义一个抽象基类,定义一些操作,使它们服从一定的协议,但许多可能并未实现,然后定义非抽象的派类,实现抽象基类中定义的行为。
这时派生类不是基类的具体化,而是抽象类的实现。
在JA V A中,有专门的纯虚类,称为接口,其作用就是为不同的类提供一个统一的接口,同时间接实现多继承(JA V A不支持多继承)。
(3)派生类是基类的结合。
当一个派生类有多于一个的基类时,它们组合在一起形成具有所有基类行为的类型。
这时要注意,不要用继承表达聚合关系。
5.2.1 基类与派生类的说明先看一个例子。
[例5.1] 派生类的说明EX5_1.CPP。
继承基类的派生类定义的一般形式:class derived_class_name:access_specifier base_class_name{……};其中access_specifier可以是3个关键字之一:public、private(默认值)或protected。
派生类也称为子类、导出类。
它具有下述特点:(1)可在基类所提供有基础上包含新成员;(2)可在自己类中隐藏基类的任何成员;(3)为新类重新定义基类中的函数;[例5.2] 子类的特点EX5_2.CPP。
5.2.2 派生类的继承权与访问域派生类的继承权如果不能有效在加以限制,就不能按照实际情况表达求解问题的复杂性。
因此访问权限是一个很重要的问题。
(1)对于基类的私有成员,派生类及派生类的使用者无权访问。
(2)对于基类的公有成员,则按派生类的定义,分为三种情况:①私有派生,继承基类的公有成员作为自己的私有成员,这些成员只能被派生类的成员函数访问。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本讲讨论基类和派生类的基本概念。
通过继承机制,可以利用已有的数据类型来定义新的数据类型。
所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。
我们称已存在的用来派生新类的类为基类,又称为父类。
由已存在的类派生出的新类称为派生类,又称为子类。
在C++(C++培训)++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。
从一个基类派生的继承称为单继承;从
多个基类派生的继承称为多继承。
派生类的定义格式
单继承的定义格式如下:
class <派生类名>:<继承方式><基类名>
{
<派生类新定义成员>
};
其中,<派生类名>是新定义的一个类的名字,它是从<基类名>中派生的,并且按指定的<继承方式>派生的。
<继承方式>常使用如
下三种关键字给予表示:
public 表示公有基类;
private 表示私有基类;
protected 表示保护基类;
多继承的定义格式如下:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基
类名2>,…
{
<派生类新定义成员>
};
可见,多继承与单继承的区别从定义格式上看,主要是多继承的
基类多于一个。
派生类的三种继承方式
公有继承(public)、私有继承(private)、保护继承(protected)是常
用的三种继承方式。
1. 公有继承(public)
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。
2. 私有继承(private)
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
3. 保护继承(protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的
私有成员仍然是私有的。
下面列出三种不同的继承方式的基类特性和派生类特性。
不同继承方式的基类和派生类特性
继承方式基类特性派生类特性公有继承
public
public protected
private protected 不可访问私有继承
public
private protected
private
private 不可访问保护继承
public protected protected
private
protected
不可访问
为了进一步理解三种不同的继承方式在其成员的可见性方面的区别,下面从三种不同角度进行讨论。
对于公有继承方式:
(1) 基类成员对其对象的可见性:
公有成员可见,其他不可见。
这里保护成员同于私有成员。
(2) 基类成员对派生类的可见性:
公有成员和保护成员可见,而私有成员不可见。
这里保护成员同
于公有成员。
(3) 基类成员对派生类对象的可见性:
公有成员可见,其他成员不可见。
所以,在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。
这里,一定要区分清楚派生类的对象和派生类中的成员函数对基类的访问是
不同的。
对于私有继承方式:
(1) 基类成员对其对象的可见性:
公有成员可见,其他成员不可见。
(2) 基类成员对派生类的可见性:
公有成员和保护成员是可见的,而私有成员是不可见的。
(3) 基类成员对派生类对象的可见性:
所有成员都是不可见的。
所以,在私有继承时,基类的成员只能由直接派生类访问,而无
法再往下继承。
对于保护继承方式:
这种继承方式与私有继承方式的情况相同。
两者的区别仅在于对派生类的成员而言,对基类成员有不同的可见性。
上述所说的可见性也就是可访问性。
关于可访问性还有另的一种说法。
这种规则中,称派生类的对象对基类访问为水平访问,称派生类的派生类对基类的访问为垂直访问。
一般规则如下:
公有继承时,水平访问和垂直访问对基类中的公有成员不受限
制;
私有继承时,水平访问和垂直访问对基类中的公有成员也不能
访问;
保护继承时,对于垂直访问同于公有继承,对于水平访问同于
私有继承。
对于基类中的私有成员,只能被基类中的成员函数和友元函数所
访问,不能被其他的函数访问。
基类与派生类的关系
任何一个类都可以派生出一个新类,派生类也可以再派生出新类,因此,基类和派生类是相对而言的。
基类与派生类之间的关系可以有如下几种描述:
1. 派生类是基类的具体化
类的层次通常反映了客观世界中某种真实的模型。
在这种情况下,不难看出:基类是对若干个派生类的抽象,而派生类是基类的具体化。
基类抽取了它的派生类的公共特征,而派生类通过增加行为将
抽象类变为某种有用的类型。
2. 派生类是基类定义的延续
先定义一个抽象基类,该基类中有些操作并未实现。
然后定义非抽象的派生类,实现抽象基类中定义的操作。
例如,虚函数就属此类情况。
这时,派生类是抽象的基类的实现,即可看成是基类定义的延续。
这也是派生类的一种常用方法。
3. 派生类是基类的组合
在多继承时,一个派生类有多于一个的基类,这时派生类将是
所有基类行为的组合。
派生类将其本身与基类区别开来的方法是添加数据成员和成员函数。
因此,继承的机制将使得在创建新类时,只需说明新类与已有类的区别,从而大量原有的程序代码都可以复用,所以有人称类是“可
复用的软件构件”。