C++ 基类和派生类

合集下载

CPP语法总结

CPP语法总结

C++语法总结(一)1. I/O流的常用控制符dec 置基数为10hex 置基数为16oct 置基数为8setfill(c) 设填充字符为Csetprecision(n) 设显示小数精度为n位setw(n) 设域宽为N个字符setiosflags(ios::fixed) 固定的符点显示setiosflags(ios::scientific)指数表示setiosflags(ios::left) 左对齐setiosflags(ios::right) 右对齐setiosflags(ios::skipws) 忽略前导空白setiosflags(ios::uppercase) 16进制数大写输出setiosflags(ios::lowercase) 6进制数小写输出setiosflags(ios::showpoint) 显示小数点setiosflags(ios::showpos) 正数前面加上正号2.头文件:*iostream.h* *iomanip.h* *stdlib.h*cout/cin 流的控制符 exit(0)3.指针的几种类型:int (*p)();p为指向函数的指针变量,该函数带回一个整形值int *p();p为带回一个指针的函数,该指针指向整形数据int (**)[n]p为一个指向一个指针变量的指针变量,被指向的指针变量指向一个含n个整形数据的一维数组4.构造函数和析构函数特点及其区别:a.构造函数可以有任意个形参,还可以重载(多个参数个数不同的函数);但析构函数不能有形参,因为是系统自动调用的.b.构造函数不可以任意调用,只准系统调用;而析构函数不仅系统调用,也可以任意调用.5.构造函数和析构函数什么时候自动运行?(例61)构造函数:一般在定义类对象时自动运行.析构函数:如果一个函数中定义了一个对象,则在这个函数运行结束时就执行一次;当一个对象是使用NEW运算符被动态创建的,在使用DELETE运算符释放它时,DELETE将会自动调用析构函数.拷贝初始化构造函数:当用tpoint N(M);语句时调用一次;当对象作为实参向形参传递时,即对形参初始化时执行一次;当遇到M=return(N);语句,即对M进行初始化时调用一次;6. this 指针用法:例63中,当程序执行语句list elem(i);时,系统对this指针进行了如下的缺省赋值:this=&list;赋值成员函数举例(此例在例63基础上):void Assign(linear_list&);//说明语句;void linear_list::Assign(linear_list&p){if(&p==this)return;nmax=p.nmax;nelem=p.nelem;list=new int[nmax];for(int i=0;i<nmax;i++)list[i]=p.list[i];}7.const,volatile对象和const,volatile成员函数格式:const person per/volatile person per;int func(int) const;/char func(int) volatile;说明:1.普通对象既可以访问const对象,又可以访问volatile对象;2.const对象只能访问用const修饰的成员函数;volatile对象只能访问用其所长volatile修饰的成员函数;3.也可以同时说明为const volatile对象或const volatile成员函数;const volatile对象只能访问const volatile成员函数;const/volatile对象也能访问const volatile成员函数;8.不同继承方式的基类和派生类特性------------------------------------------------继承方式 | 基类特性 | 派生类特性------------------------------------------------| public | public公有继承 | protected | protected| private | 不可访问------------------------------------------------| public | private私有继承 | protected | private| private | 不可访问------------------------------------------------| public | protected保护继承 | protected | protected| private | 不可访问------------------------------------------------A:帮助理解:1)对于公有继承方式:a.基类成员对其对象的可见性:公有成员可见,其他不可见。

基类和派生类

基类和派生类
这里说的访问来自两个方面:一是派生类中的新增成 员对从基类继承来的成员的访问;二是在派生类外部通 过派生类的对象对从基类继承来的成员的访问。
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.在派生类中重定义基类的函数
派生类自动继承了基类中定义的数据成员和成员函数。 如果派生类认为基类中某个成员函数的实现不能满足需 要,可以在派生类中重新定义该函数。
重定义基类的成员函数需要使用和该函数相同的函数 名和参数列表,如果参数列表不同,就是函数重载而不 是函数的重定义了。

面向对象程序设计习题及答案

面向对象程序设计习题及答案

面向对象程序设计一、选择填空1. 关于C + +与C语言的关系描述中,(D)是错误的。

(A)C语言是C + +的一个子集 (B) C语言与C++是兼容的(C) C++对C语言进行了一些改进(D) C++和C语言都是面向对象的2. 下面关于对象概念的描述中,(B)是错误的。

(A )对象就是C语言的结构变量(B)对象代表着正在创建的系统中的一个实体(C)对象是一个状态的操作(或方法)的封装体(D)对象之间的信息传递是通过消息进行的3. 下面关于类概念的描述中,(D)是错误的。

(A )类是抽象数据类型的实现(B )类是具有共同行为的若干对象的统一描述体(C)类是创建对象的样板(D)类就是C语言的结构类型4. 按照标识符的要求,(A )符号不能组成标识符。

(A )连接符 (B)下划线 (C)大小写字母 (D)数字字符5. 下列符号中,(C)不可作为分隔符。

(A), (B) : (C)? ( D);6. 在16位机中,int型字宽为(A)字节。

(A ) 2 ( B) 4 ( C) 6 (D) 87. 类型修饰符unsigned修饰(D)类型是错误的。

(A)char ( B) int (C) long int (D) float& 对于int *pa[5];的描述,(D)是正确的。

(A)pa是一个指向数组的指针,所指向的数组是5个int型元素(B)pa是一个指向某数组中第5个元素的指针,该元素是int变量(C)pa[5]表示某个数组的第5个元素(D)pa是一个具有5个元素的指针数组,每个元素是一个int型指针。

9. 下列关于指针的运算中,(D)是非法的。

(A)两个指针在一定条件下,可以进行相等或不等的运算。

(B)可以有一个空指针赋值给某个指针。

(C)一个指针可以加上一个整数。

(D)两个指针在一定条件下,可以相加。

10. 指针可以用来表示数组元素,下列表示中( A )是错误的。

已知:int a[3][7];(A)*(a+1)[5] ( B) *(*a+3) (C) *(*(a+1)) (D) *(&a[0][0]+2)11. 下列表示引用的方法中,(A )是正确的。

第5章 继承和派生类

第5章 继承和派生类
面象对象程序设计
2010/9/18
第5章 继承和派生类
程序运行结果: x=4 y=5 l=6 w=8 程序分析: 通过公有继承方式,从BaseClas类得到DerivedClass类。 派生类DerivedClass只有一个基类,所以是单继承。基类 BaseClass定义了两个数据成员,3个成员函数。派生类 DerivedClass定义了两个数据成员,3个成员函数。通过 继承,派生类DerivedClass拥有4个数据成员:x、y、l和 w,6个成员函数:setx ( )、sety ( )、setl ()、setw ( )、 displayxy ( )、displaylw( )。
2010/9/18
面象对象程序设计
第5章 继承和派生类
class Father:private Grandfather //中间类:Grandfather的 公有派生类, //Son的基类 { public: void test() { b1=10; //可以访问,因b1改为private b2=20; //可以访问,因b2改为private b3=30; //不可访问, 因b3改为不可访问 } };
2010/9/18
面象对象程序设计
第5章 继承和派生类
5.1.2 继承的种类
在C++语言中,一个派生类既可以从一个基类派生,也可 以从多个基类派生。从一个基类派生的继承被称为单继承。 单继承形成的类层次是一个倒挂的树,如图5.2所示。从 多个基类派生类的继承被称为多继承。多继承形成的类层 次是一个有向无环图(DAG),如图5.3所示。在图5.2中, 输入设备是基类,从它派生出了3个派生类:键盘类、鼠 标类和扫描仪类。在图5.3中,从教师类和干部类派生出 校长类,即校长类有两个基类。

C 课后习题答案第七章

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++中三种继承方式的区别

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在类外就没有了可以引⽤的继承过来成员了!//这些继承⽅式是很难理解的.最好的办法就是多写代码去试.。

C++_CHAP9_史玉珍

C++_CHAP9_史玉珍

第9章 继承与派生
构造函数

构造函数不能够被继承,因此,派生类的构造函 数必须通过跳动基类的构造函数来初始化函数子 对象,所以,在定义派生类的构造函数时,除了 对自己的数据成员进行初始化外,还必须负责调 用基类构造函数使基类的数据成员得以初始化。 如果派生类汇总还有子对象时,还应包含对子对 象初始化的构造函数。
public protected private
public protected 不可访问 public private 不可访问
protected Private 不可访问
私有继承
保护继承
第9章 继承与派生
9.2 单继承

9.2.1 9.2.2 9.2.3 9.2.4
基类成员的访问权限 构造函数和析构函数 作用域运算符:: 子类型和类型适应
void main() { B obj1; B obj2(5,6); B obj3(7,8,9); obj1.print(); obj2.print(); obj3.print(); }
第9章 继承与派生
派生类构造函数使用中应注意的问题
(1)派生类构造函数的定义中可以省略对基本结 构函数的调用,其条件是在基类中必须有缺省的 构造函数或者根本没有定义的构造函数。当然, 基类中没有定义构造函数,派生类基本不必负责 调用派生类构造函数。 (2)当基类的构造函数使用一个或多个参数时则 派生类必须定义构造函数,提供将参数传递给基类 构造函数的途径。在有的情况下,派生类构造函数 的函数体可能为空,仅起到参数传递作用。
第9章 继承与派生
9.1.2 派生类的定义格式
单继承的定义格式如下:
class <派生类名>:<继承方式><基类名

基类和派生类的构造顺序

基类和派生类的构造顺序

《基类和派生类的构造顺序》同学们,今天咱们来聊聊基类和派生类的构造顺序,这可是编程里很重要的知识哟!想象一下,基类就像是一个基础的房子框架,派生类呢,就是在这个基础框架上进行装饰和扩展的部分。

当我们创建一个派生类的对象时,先构造的是基类。

为啥呢?因为基类是基础呀,得先把基础打好。

比如说,基类里可能有一些最基本的设置,像房子的地基。

举个例子,假如基类是“动物”,派生类是“猫”。

在创建一只猫的时候,得先有动物的一些基本特征,比如有生命、能活动,然后才有猫的独特特点,像会抓老鼠、爱撒娇。

所以呀,记住这个顺序,先基类后派生类,这样我们在编程的时候就能更清楚啦!《基类和派生类的构造顺序》同学们,咱们来深入了解一下基类和派生类的构造顺序。

先把基类想象成一个大蛋糕的底层,派生类就是在这个底层上面加的各种美味装饰。

当我们要做出一个完整的蛋糕,也就是创建一个派生类对象时,肯定要先有底层的蛋糕坯,这就是基类的构造。

比如说,基类是“交通工具”,派生类是“汽车”。

那得先有交通工具的通用属性,像能移动,然后才有汽车的特别之处,比如有四个轮子、靠汽油驱动。

这个构造顺序很重要哦,如果顺序不对,就像做蛋糕先放装饰再做底层,那可就乱套啦!《基类和派生类的构造顺序》同学们,今天讲讲基类和派生类的构造顺序,这个可有意思啦!把基类当成是一棵大树的树干,派生类就是树干上长出来的树枝和树叶。

当这棵树要长大的时候,肯定得先有树干呀,这就是基类的构造。

比如基类是“水果”,派生类是“苹果”。

先要有水果的共性,像能吃、有营养,然后才有苹果的特点,比如红红的、甜甜的。

要是顺序反了,就像树先长叶子再长树干,那多奇怪呀!所以一定要记住,先构造基类,再构造派生类哟!。

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

C++ 基类和派生类
9/4/2001 8:37:5· ·--··
本讲讨论基类和派生类的基本概念。

通过继承机制,可以利用已有的数据类型来定义新的数据类型。

所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。

我们称已存在的用来派生新类的类为基类,又称为父类。

由已存在的类派生出的新类称为派生类,又称为子类。

在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. 派生类是基类的组合
在多继承时,一个派生类有多于一个的基类,这时派生类将是所有基类行为的组合。

派生类将其本身与基类区别开来的方法是添加数据成员和成员函数。

因此,继承的机制将使得在创建新类时,只需说明新类与已有类的区别,从而大量原有的程序代码都可以复用,所以有人称类是“可复用的软件构件”。

相关文档
最新文档