实验十六 继承和派生的基本概念汇总
c 继承与派生实验报告

c 继承与派生实验报告
C 继承与派生实验报告
实验目的:通过实验,掌握C语言中继承与派生的概念和使用方法,加深对面向对象编程的理解。
实验内容:在C语言中,继承与派生是面向对象编程中非常重要的概念。
在本次实验中,我们将通过一个简单的例子来演示C语言中的继承与派生的用法。
首先,我们定义一个基类(父类)Person,包括姓名和年龄两个成员变量,以及一个显示信息的成员函数。
然后,我们定义一个派生类(子类)Student,继承自Person类,新增一个成员变量学号,并重写显示信息的成员函数。
在实验中,我们首先创建一个Person对象,设置姓名和年龄,然后调用显示信息函数,观察结果。
接着,我们创建一个Student对象,设置姓名、年龄和学号,再次调用显示信息函数,观察结果。
实验结果:通过实验,我们成功实现了C语言中的继承与派生。
我们发现,通过继承,子类Student可以直接使用父类Person中的成员变量和成员函数,同时可以新增自己的成员变量和函数。
这样的设计使得代码更加简洁和灵活,提高了代码的复用性和可维护性。
结论:C语言中的继承与派生是面向对象编程中非常重要的概念,通过本次实验,我们深入理解了这一概念的用法和意义。
掌握了继承与派生的方法后,我们可以更加灵活地设计和编写程序,提高代码的质量和效率。
总结:通过本次实验,我们对C语言中的继承与派生有了更深入的理解,加深了对面向对象编程的认识。
在今后的学习和工作中,我们将更加灵活地运用继承与派生的方法,提高代码的质量和效率。
继承与派生

4.1 继承和派生的概念
在软件开发过程中,在定义特殊类时,不需把它的一 般类已经定义过的属性和服务重复地书写一遍,只需要声 明它是某个类的特殊类,并定义它自己的特殊属性和服务。 这将明显地减轻开发工作的强度。 4.1.2 继承的作用 面向对象程序设计的继承性使得大型应用程序的维护 和设计变得更加简单。一方面,大型应用程序设计完成并 交付使用后,经常面临用户的需求发生变化,程序功能需 要扩充等问题。这时程序的修改需要非常谨慎,因为某个 局部的修改可能会影响其他部分,而一个正在使用中的系 统要进行全面的测试,既费时间又有很多实际的困难。另 一方面,一个新的应用系统程序设计在许多方面会和以前 设计过的某个或某些系统的模块非常类似,怎样加快大型 应用程序的开发速度,重用这些已经开发成功的程序模块, 一直是软件设计中迫切需要解决的问题。
4.2 派生类
C++语言派生类多重继承的定义格式如下: class <派生类名>:[继承方式1] [<基类名1>],[继承 方式2] [<基类名2>],…, [继承方式n] [<基类名n>] { <派生类成员变量和成员函数定义> }; 通常,在多重继承时,继承方式设计成一致的形式。 如继承方式均设计成public,或均设计成private。
7章_继承与派生

例1 void main() class A{ { A a; protected: B b; int X; b.Function(); }; a.X=5; class B:public A b.X=7; { } public: 错误,水平访问时 void Function(); 保护成员相当于 }; 私有成员 void B::Function() { 正确,垂直访问时 X=5; 保护成员相当于 }
例(续2)
#include <iostream> using namespace std; void main( ) { Rectangle rect; rect.InitR(2,3,20,10); //水平访问 rect.Move(3,2); // 直接调用基类公有成员函数 cout<<rect.GetX()<<","<<rect.GetY()<<"," <<rect.GetH()<<", "<<rect.GetW()<<endl; } 输出: 5,5,10,20
公有成员
例7_1:分析下列程序中的访问权限
class Point { public: void InitP(int xx,int yy); void Move(int xOff,int yOff); int GetX() {return X;} int GetY() {return Y;} private: int X,Y; }; //基类声明结束 void Point::InitP(int xx,int yy) //函数成员实现 { X=xx; Y=yy; } void Point::Move(int xOff,int yOff) { X+=xOff; Y+=yOff; }
1. 继承与派生的概念。

1. 继承与派生的概念。
1. 继承的概念:继承是面向对象编程中的一个重要概念,它允许我们创建新的类,通过继承现有类的属性和方法来实现代码的重用。
在继承中,有两个类之间的关系,一个是称为父类或基类的类,另一个是称为子类或派生类的类。
子类继承了父类的属性和方法,并且可以根据需要添加自己的额外属性和方法。
继承的概念可以通过一个简单的例子来说明。
假设我们有一个父类叫做An i m a l,它有一个属性n a m e和一个方法s p e a k。
然后我们创建一个子类叫做C a t,它继承了A n i m a l类的属性和方法,并且可以添加自己的额外属性和方法。
通过继承,C a t类可以访问和使用A n i m a l类的属性和方法,同时也可以根据需要添加新的行为。
2.派生的概念:派生是指在继承的过程中创建子类的过程。
通过派生,我们可以基于父类创建新的子类,并且在子类中添加新的属性和方法来实现代码的扩展和重用。
派生可以看作是继承的一种具体实现方式。
派生的概念可以通过继续上面的例子来说明。
假设我们有一个C a t类作为子类,它继承了A n i m a l类作为父类。
在C at类中,我们可以添加额外的属性和方法,如c o l o r和c a t c h M o u s e。
通过派生,C a t类可以获得An i m a l类的属性和方法,并且可以根据需要添加自己的新行为。
3.继承与派生的关系:继承和派生是紧密相关的概念。
继承是指子类从父类继承属性和方法的过程,以实现代码的重用。
而派生是指在继承的过程中创建子类,并且在子类中添加新的属性和方法的过程,以实现代码的扩展。
继承和派生的关系可以通过一个更复杂的例子来说明。
假设我们有一个基类叫做S h a p e,它有一个属性co l o r和一个方法d r a w。
然后我们创建两个子类,一个是C i r c l e,另一个是R e c t a n g l e,它们分别继承了S h a p e类,并且可以根据需要添加自己的额外属性和方法。
《继承与派生 》课件

目录
CONTENTS
• 继承与派生的基本概念 • 继承的方式 • 派生类的构造函数和析构函数 • 继承与多态 • 继承与重载
01
继承与派生的基本 概念
继承的定义
继承是面向对象编程中的一个重 要概念,它允许一个类(子类) 继承另一个类(父类)的属性和
方法。
通过继承,子类可以复用父类的 代码,减少代码冗余,提高代码
保护继承
总结词
保护继承是指基类的保护成员在派生类 中保持保护属性,可以被派生类和派生 类的对象访问。
VS
详细描述
保护继承时,基类的保护成员在派生类中 保持保护属性,可以被派生类和派生类的 对象访问。这种继承方式使得基类的保护 成员成为派生类的保护成员,可以被派生 类和派生类的对象访问。因此,派生类可 以继承基类的保护成员函数和变量。
03
派生类的构造函数 和析构函数
派生类的构造函数
派生类构造函数的作用
派生类构造函数用于初始化派生类对象,包括调用基类构造函数 和执行派生类特有的初始化操作。
派生类构造函数的执行顺序
派生类构造函数的执行顺序是在创建派生类对象时,先调用基类构 造函数,然后执行派生类构造函数体中的代码。
派生类构造函数的参数
继承和派生共同实现 了面向对象编程中的 代码复用和多态性。
派生是继承的一种表 现形式,通过派生可 以创建新的类。
02
继承的方式
公有继承
总结词
公有继承是ቤተ መጻሕፍቲ ባይዱ基类的公有成员在派生类中仍为公有成员,可以被派生类和派生类的对象访问。
详细描述
公有继承时,基类的公有成员在派生类中保持公有属性,派生类可以访问基类的公有和保护成员。这种继承方式 使得基类的公有成员成为派生类的公有成员,可以被派生类和派生类的对象直接访问,因此派生类可以继承基类 的公有成员函数和变量。
继承与派生

§5 派生类的构造函数和析构函数
构造函数的主要作用是对数据成员初始化, 构造函数的主要作用是对数据成员初始化, 所以在设计派生类的构造函数时,不仅要考 所以在设计派生类的构造函数时, 虑派生类所增加的数据成员的初始化, 虑派生类所增加的数据成员的初始化,还应 当考虑基类的数据成员的初始化。 当考虑基类的数据成员的初始化。在执行派 生类的构造函数时, 生类的构造函数时,调用基类的构造函数
一、简单的派生类的构造函数
1、概念 、 任何派生类都包含基类的成员, 任何派生类都包含基类的成员,简单的派生类只 有一个基类,而且只有一级派生(只有直接派生类 有一个基类,而且只有一级派生 只有直接派生类 没有间接派生类), ,没有间接派生类 ,在派生类的数据成员中不包 含基类的对象(即子对象 即子对象)。 含基类的对象 即子对象 。 2、其一般形式为: 、其一般形式为: 派生类构造函数名(总参数表列) 派生类构造函数名(总参数表列): 基类构造 函数名(参数表列) 函数名(参数表列) {派生类中新增数据成员初始化语句 派生类中新增数据成员初始化语句} 派生类中新增数据成员初始化语句
二、私有继承
2、私有基类在派生类中的访问属性 、 私有基类的成员 在私有派生类中的访问属性 私有成员 不可访问 公用成员 私有 私有 保护成员 3、例11.2 、
三、保护成员和保护继承
1、概念 、 声明的成员称为“ 由protected声明的成员称为“受保护的成员”, 声明的成员称为 受保护的成员” 或简称“保护成员” 或简称“保护成员”,保护成员可以被派生类的 成员函数引用
第十二章 继承与派生
§1 继承与派生的概念
继承: 继承:是在一个已存在的类的基础上建立一个新 的类,已存在的类称为“基类” 父类” 的类,已存在的类称为“基类”或“父类”。新 建立的类称为“派生类” 子类” 建立的类称为“派生类”或“子类”。 一个新类从已有的类那里获得其已有特性, 一个新类从已有的类那里获得其已有特性,这种 现象称为类的继承 从已有的类(父类 类的继承。 父类)产生一个新 现象称为类的继承。从已有的类 父类 产生一个新 的子类,称为类的派生 类的派生。 的子类,称为类的派生。 单继承: 单继承:一个派生类只从一个基类派生 多继承: 多继承:一个派生类有两个或多个基类 派生类是基类的具体化, 派生类是基类的具体化,而基类则是派生类的抽象
继承与派生

继承与派生一、派生的定义假定有一个类A,并根据类A的定义创建一个新类B,类A就称为基类,类B就称称为类A的派生类。
派生类自动包含基类的所有数据成员和成员函数。
这称为派生类继承了基类的数据成员和函数成员。
派生类的定义方式为:class 派生类名:继承方式基类名{……};可以这样认为,派生类的定义包含了基类的定义,也就是派生类的定义是在基类定义之上的扩充。
如图:二、继承与聚合不是所有关系都可以应用为继承关系。
如果要应用为继承,需要进行几个测试。
这里先假定有两个类A和B:●种类测试(包含测试)。
类B是类A的一个子集,即类B包含于类A。
●特殊性测试。
通过种类测试之后,再看类A中是否有不适用于类B的特殊属性。
如果有,需要修改它们的派生关系,再进行派生。
●属于测试。
若类A和B没有通过种类测试,则可以进行属于测试。
如果类B可以表示成类A的一个元素(不是子集),也就是说类B是类A的一部分,那么类A和B应该表示成聚合,而非派生。
举个例子,类Animal表示所有的动物,类Dog表示狗,显然类Dog只是类Animal的一个子集,因此它们可以表示成派生关系(但需要修改)。
又如,类Automobile表示汽车,类Engine表示发动机,显然类Engine是类Automobile的一个元素,它们只能表示成聚合关系。
有一种特殊情况,就是两个类没有通过上面所有的测试,那说明它们的关系不明确。
三、继承方式和基类中访问指定符对继承的影响继承方式和基类中的访问指定符分别可以是public、private和protected中的一种,因此共有3×3=9种组合。
用一个表来说明继承方式和基类访问指定符的作用:①当基类成员是private时,无论继承方式是什么,它在派生类中都是private。
②当基类成员是private时,虽然它会继承为派生类的private成员,但是它不能被派生类的成员函数访问,只能被继承自基类的成员函数访问。
继承与派生实验报告

继承与派生实验报告继承与派生实验报告引言:继承与派生是面向对象编程中的重要概念,通过继承,一个类可以派生出子类,从而实现代码的复用和扩展。
本文将通过实验来探讨继承与派生的概念、原理和应用。
实验目的:1. 理解继承与派生的概念和原理;2. 掌握如何在编程语言中实现继承和派生;3. 熟悉继承与派生的应用场景。
实验步骤:1. 创建父类:首先,我们创建一个名为"Animal"的父类,该类具有属性和方法,例如"age"和"eat()"。
2. 创建子类:接下来,我们创建一个名为"Cat"的子类,该类继承自"Animal"类。
在子类中,我们可以重写父类的方法或添加新的方法。
3. 实例化对象:通过实例化父类和子类的对象,我们可以调用它们的方法和访问它们的属性。
4. 测试继承与派生:我们可以通过调用父类和子类的方法,观察它们的行为是否符合预期。
实验结果:在创建父类"Animal"时,我们定义了一个"age"属性和一个"eat()"方法。
在创建子类"Cat"时,我们继承了父类的属性和方法,并添加了一个新的"meow()"方法。
在实例化父类对象时,我们可以通过调用"eat()"方法来模拟动物进食的行为。
而在实例化子类对象时,我们既可以调用从父类继承而来的"eat()"方法,也可以调用子类特有的"meow()"方法来模拟猫咪的叫声。
通过实验,我们发现继承与派生的优势在于代码的复用和扩展。
我们只需在父类中定义一次通用的属性和方法,然后让不同的子类继承父类,即可实现代码的复用。
同时,子类还可以通过重写父类的方法或添加新的方法,实现代码的扩展和个性化。
讨论与应用:继承与派生不仅仅局限于上述的父类和子类关系,它还可以在多层次的继承结构中发挥作用。
《继承和派生》课件

派生类的析构函数
派生类析构函数在销毁派生类对象时 自动调用,用于释放派生类所占用的 资源。
派生类析构函数可以包含代码,用于 清理派生类所占用的资源。
派生类析构函数可以访问基类的析构 函数,通过使用`this`关键字调用基类 析构函数。
派生类析构函数可以重载基类析构函 数,以便在销毁派生类对象时执行特 定的操作。
基类析构函数的调用
在派生类的析构函数中,可以通过使用`this`关键字调 用基类的析构函数,以确保基类资源得到正确释放。
输标02入题
如果在派生类的析构函数中没有显式调用基类的析构 函数,则编译器会自动调用基类的默认析构函数。
01
03
在某些情况下,可能需要显式调用基类的析构函数, 以确保资源得到正确释放。例如,当基类包含动态分
02 继承的方式
公有继承
总结词
公有继承是指子类可以访问父类的公有成员。
详细描述
在公有继承中,子类可以访问父类的公有成员(即不加任 何修饰符的成员),这些成员在子类中保持公有属性。子 类可以继承和使用父类的公有成员,包括函数、变量、常 量等。
总结词
公有继承是实现代码复用的一种方式。
详细描述
通过公有继承,子类可以继承父类的公有成员,从而避免 重复编写相同的代码。这有助于提高代码的复用性和维护 性。
注意事项
虚函数和纯虚函数的使用 应合理规划,避免过度使 用导致程序复杂度和维护 成本增加。
继承和派生的效率问题
继承
通过共享已存在的代码, 减少代码冗余。但也可能 导致内存浪费和性能下降 。
派生
通过扩展已有类,增加新 功能或修改已有功能。但 也可能导致内存消耗增加 和性能下降。
注意事项
第5章 继承与派生总结

private 成员 protected 成员 public 成员
派生类
不可访问 protected 成员 protected 成员 private 成员 protected 成员 public 成员
8
简单派生类的构造函数
派生类构造函数(总参数列表): 基类构造函 数(参数列表)
派生类中新增数据成员初始化语句
}
注意:调用基类、子对象的构造函数的顺序是按 照声明派生类时基类、子对象出现的顺序来调用 的。
12
5.6 多重继承
(三)多重继承引起的二义性问题 1、两个基类有同名成员
2、两个基类和派生类有同名成员
3、两个直接基类都继承于同一基类
13
5.6 多重继承
(四)虚基类 虚基类的作用:可以使得在继承间接共同 基类时只保留一份成员。 虚基类是在派生类的声明过程中声明的, 一般形式为: class 派生类名:virtual [继承方式] 基类名 {
继承与组合
20
目标
理解派生和继承的相关概念; 掌握派生类的声明方式
掌握派生类的构成和成员的访问属性;
掌握派生类构造函数和析构函数的使用方 法; 掌握多重继承的方法; 理解基类和派生类的转换方法; 理解继承与组合的含义。
21
练习
以点(point)类为基类,派生类圆类,圆由圆心 和半径定义。派生类操作判断任一坐标点是在图 形内,还是在图形的边缘上,还是在图形外。
5.8 继承与组合
继承建立了派生类与基类之间的一种“是” 的关系,是纵向的。 组合建立了成员类和组合类(复合类)之 间的一种“有”的关系,是横向的。
19
总结
本章主要讲授内容 继承和派生的概念
派生与继承

继承与派生
(2)改造。改造是指对吸收进来的基类成员的改 改造。 改造 造。它包括两个方面:一个是对基类成员访问 它包括两个方面: 控制的调整, 控制的调整,它是通过派生类定义时的继承方 式来确定。另一个就是对基类成员的隐藏, 式来确定。另一个就是对基类成员的隐藏,即 在派生类中声明一个与基类成员同名的新成员, 在派生类中声明一个与基类成员同名的新成员, 这个新成员就隐藏了上层的所有同名成员。 这个新成员就隐藏了上层的所有同名成员。这 时,在派生类中或者通过派生类的对象来直接 使用该成员名, 使用该成员名,就只能访问到派生类中声明的 同名成员,这称为同名隐藏或同名覆盖。 同名成员,这称为同名隐藏或同名覆盖。
继承与派生
继承性的具体实现也就是一个派生类的建立过程。 继承性的具体实现也就是一个派生类的建立过程。 class 派生类名 : 继承方式 基类名 继承方式 基类名 基类名1, 基类名2, … , 继承方式 基类名 基类名n { 新增派生类成员声明; 新增派生类成员声明 }; 继承方式关键字有三个: 继承方式关键字有三个:public、private、protected。 、 、 。 继承方式关键字只对紧随其后的基类起作用。 继承方式关键字只对紧随其后的基类起作用。 在继承与派生的过程中,一个基类可以派生出多个派生类, 在继承与派生的过程中,一个基类可以派生出多个派生类, 每一个派生类又可以作为基类再派生出新的派生类, 每一个派生类又可以作为基类再派生出新的派生类,基类和 派生类是相对而言的。这样,一代一代地派生下去, 派生类是相对而言的。这样,一代一代地派生下去,就形成 了一个相互关联的有层次的类的家族,称为类族。在类族中, 了一个相互关联的有层次的类的家族,称为类族。在类族中, 作为上下层直接联系而参与派生出某类的基类称为该派生类 的直接基类, 的直接基类,而基类的基类甚至更高层的基类则称为间接基 类。
继承和派生

派生类构造函数调用顺序:
基类的构造函数;
子对象的构造函数;
派生类构造函数体;
二、派生类的析构函数
析构函数不能被继承; 执行派生类的析构函数时,基类的析构函数也 将被调用;
析构函数的执行顺序与构造函数严格相反;
派生类的析构函数; 基类的析构函数;
[例]分析下列程序
#include <iostream.h> class B B::~B() {public: { cout<<"B's destructor called. "<<endl; } B(); void B::Print() const B(int i); { cout<<b<<endl; } ~B(); void Print() const; private: int b; }; B::B() { b=0; cout<<"B's default constructor called. "<<endl;} B::B(int i) { b=i; cout<<"B's constructor called. "<<endl; }
回答下列问题,并说明原因。
1、派生类B中成员函数f2()能否访问基类A的成员:f1()、j1和i1? 可以访问f1()和j1,不可以访问i1; 2、能否通过派生类B的对象b访问基类A成员:f1()、j1和i1? 可以访问f1(),不可以访问j1和i1; 3、派生类C的成员函数f3()能否访问直接基类B的成员f2()、j2 和i2?能否访问间接基类A的成员: f1()、j1和i1? 可以访问直接基类中的f2()和j2以及间接基类中的f1()和j1, 不可以访问i2和i1; 4、能否通过派生类C对象c访问直接基类B中的成员:f2()、j2和i2? 能否访问间接基类A中的成员: f1()、j1和i1?
继承和派生——类与类之间的关系、继承的基本概念、继承的方式、继承中的构造和析构

继承和派⽣——类与类之间的关系、继承的基本概念、继承的⽅式、继承中的构造和析构1、类与类之间的关系 has-A,uses-A 和 is-A has-A 包含关系,⽤以描述⼀个类由多个“部件类”构成。
实现has-A关系⽤类成员表⽰,即⼀个类中的数据成员是另⼀种已经定义的类。
uses-A ⼀个类部分地使⽤另⼀个类。
通过类之间成员函数的相互联系,定义友员或对象参数传递实现。
is-A 机制称为“继承”。
关系具有传递性,不具有对称性。
class A{public:void funcA(){}int a;};//类B拥有类A的成员变量,B has A,类B 依赖于类Aclass B{public:void funcB(){}A a;};//类C的成员⽅法需要类A的形参,C use A,类C 依赖于类Aclass C{public:void funcC(A *a){}void funcCC(){}};//类D继承于类A, 类D如果是继承类A,类D is 类A,类C 继承于类A,耦合度很⾼class D:public A{public:void funcD(){cout << a << endl;}};2、继承的基本概念 类的继承,是新的类从已有类那⾥得到已有的特性,或从已有类产⽣新类的过程就是类的派⽣。
原有的类称为基类或⽗类,产⽣的新类称为派⽣类或⼦类。
派⽣与继承,是同⼀种意义两种称谓。
is-A 的关系。
派⽣类的⽣成 派⽣类中的成员,包含两⼤部分,⼀类是从基类继承过来的,⼀类是⾃⼰增加的成员。
从基类继承过过来的表现其共性,⽽新增的成员体现了其个性。
⼏点说明:1,全盘接收,除了构造器与析构器。
基类有可能会造成派⽣类的成员冗余,所以说基类是需设计的。
2,派⽣类有了⾃⼰的个性,使派⽣类有了意义。
只能在当前类中访问的成员设置为private3、只能在当前类和⼦类中访问的成员设置为protected,protected成员的访问权限介于public和private之间。
继承与派生——精选推荐

继承与派⽣继承与派⽣概述:继承与派⽣是同⼀个过程从不同的⾓度看:保持已有类的特性⽽构成新类的过程称为继承在已有类的基础上新增⾃⼰的特性⽽产⽣新类的过程称为派⽣被继承的已有类成为基类(⽗类)base class派⽣出的新类称为派⽣类(⼦类)derived class直接参与派⽣出某类的基类成为直接基类基类的基类甚⾄更⾼层的基类称为间接基类继承的⽬的:实现设计与代码的重⽤,充分利⽤原有的类派⽣的⽬的:当新的问题出现,原有程序⽆法解决,需要对原有程序进⾏改造单继承时派⽣类的定义: class 派⽣类名:继承⽅式基类名{成员声明;}例⼦:class Derived: public Base{public:Derived();~Derived();};多继承时派⽣类的定义:class 派⽣类名:继承⽅式1 基类名1,继承⽅式2 基类名2,。
{成员声明;};例⼦:class Derived: public Base1, private Base 2{public:Derived();~Derived();};派⽣类的构成:吸收基类的成员,(默认情况下,派⽣类包含全部基类中除了构造函数之外的所有成员,C++11规定可以使⽤using语句继承基类构造函数)改造基类成员,(如果派⽣类中声明了⼀个和某基类成员同名的新成员,派⽣的新成员就隐藏或覆盖了外层同名成员)添加新的成员继承⽅式简介:三种继承⽅式:公有(public ),私有(private),保护继承(protected)重点写⼀下保护成员:在派⽣类中可以作为public,在基类中类似private。
(也就是说,如果想要把基类中的私有成员给派⽣类⽤,但是却⼜不想将此成员作为public成员,可以设定为protected成员,这样可以达到派⽣类可以访问的效果)私有继承:将除了私有成员的其他成员转换成派⽣类的私有成员派⽣类的构造函数:派⽣类新增成员:派⽣类定义构造函数初始化;继承来的成员:⾃动调⽤基类构造函数进⾏初始化;派⽣类的构造函数需要给基类的构造函数传递参数。
继承与派生的实验总结

继承与派生的实验总结继承与派生这事儿啊,可太有意思了。
我做这个实验的时候啊,就跟那刘姥姥进大观园似的,啥都新鲜。
我就瞅着那些代码啊,就像是一群小蚂蚁排着队,继承就像是一个小蚂蚁跟在大蚂蚁后面,大蚂蚁有的东西,小蚂蚁也有了一部分,可它又有点自己的小个性,这就是派生了。
我当时就对着电脑屏幕,眼睛瞪得跟铜铃似的,心里想:“这玩意儿可真神奇。
”我旁边坐的是小李,那小子头发乱得像个鸡窝,眼睛老是眯着,跟没睡醒似的。
他捣鼓这个实验比我快,我就凑过去问他:“小李啊,你这咋整的啊?我这继承咋就派生不出来我想要的东西呢?”小李看了我一眼,慢悠悠地说:“你看你,就跟那没头的苍蝇似的,乱撞。
你得先把基础的继承关系搞明白,就像盖房子,地基打不好,能往上盖楼吗?”我一听,觉得挺有道理,可还是有点迷糊。
我又回到我的座位上,看着那一行行代码,感觉它们像是在跟我作对。
我挠挠头,这时候阳光从窗户透进来,照在我脸上,暖烘烘的,可我心里却有点烦躁。
我就想啊,这继承和派生啊,就像家族里的事儿一样。
老祖宗传下来的东西,子孙后代有的好好继承,还能发展出自己的新玩意儿,有的就给弄丢了或者弄歪了。
这代码也是啊,从基类到派生类,得有个传承的脉络。
我就重新开始梳理,一行一行地看,一个字符一个字符地对。
这时候,我感觉我就像一个侦探,在寻找那些隐藏在代码里的线索。
突然,我就发现了问题所在,原来是我在一个函数的参数设置上出了岔子。
我一拍大腿,“原来是你这个小坏蛋在捣乱。
”我赶紧改过来,再一运行,成了!那感觉就像是在黑暗里摸索了好久,突然找到了灯的开关一样,整个世界都亮堂了。
这个实验让我明白啊,继承和派生可不只是简单的代码操作,它就像是一种传承的智慧,不管是在代码的世界里,还是在我们的生活中,都有着重要的意义呢。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十六继承和派生的基本概念
一、实验目的
继承与派生是面向对象的特性,是面向对象程序设计模拟客观世界的手段之一,本实验的内容包括介绍MFC基础类的派生关系,通过实验要求掌握以下内容。
1.掌握类继承与派生关系以及实现方法,理解类的层次结构。
2.掌握派生类构造函数初始化基类成员和对象成员的方法。
3.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。
二、实验内容
1.范例:定义一个继承与派生关系的类体系,在派生类中访问基类成员。
先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员;以点为基类派生一个圆类,
增加表示半径的数据成员,重载显示和计算面积的函数;定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,
不能用派生方式。
编程测试所定义的类体系。
【程序】
cl3=cl1;
cout<<"cl3圆面积:"<< cl3.Area()<< endl;
cl3.Show();
cout<<"线面积:"<< ln1. Area()<<'\t'<<"线长度:"<< ln1. GetLength()<< endl;
ln1.Show();
ln2.Show();
return 0;
}
【注意】
在Point 类中,将Line 类定义为友元,便于在Line 类中访问;Point 类的x 和y 定义为Protected 访问权限,便于派生类访问。
注意派生类的构造函数中对基类数据成员的初始化方法(即 Circle(double xv,double yv,double vv):Point(xv,yv)),
以及构造函数中对对象成员的初始化方法(即 Line(double xv1,double
yv1,double xv2,double yv2) : start(xv1,yv1),end(xv2,yv2){ } )
【要求】
(1)建立工程,录入上述程序,改变数据实验之。
(2)修改Point 类的数据成员x ,y 的访问权限为private ,再运行,结果如何?
(3)如果不将Line 类设为 Point 类的友元,应采取什么措施?为哪个类增加数据或函数成员?
2.编程:多层派生练习,由上题Point 类和Circle 类继续派生出Cylinder 类。
要求计算圆柱体的底面积、侧面积、全面积和体积。