919092-C++程序设计教程-第7章 继承与多态性

合集下载

C++语言程序设计第7章 继承与派生

C++语言程序设计第7章 继承与派生
– 父类(Parent Class),Smalltalk语言称为超 类(Super Class)
• 派生出的新类称为派生类(Derived Class)
– 子类(Child Class),Smalltalk语言称为子类 (Sub Class)
继承与派生问题举例

工人
农民
商人
知识分子
军人
教师
医生
军医
void setY(float Y); float getY();
公有 公有
公有 公有 公有 公有
继承
void moveTo(Point newPoint);
Point(void); Point(const Point &); ~Point(void); Point& operator=(Point&);
来源
Circle的成员
原访 新访问权限 问 权 限
私有 不可直接访问 私有 不可直接访问 公有 公有 公有 公有
备注
继承 继承 继承 继承
float x; float y; void initPoint(float X, float Y); void setX(float X);
继承
继承 继承
float getX();
• 声明语法 : class 派生类名:继承方式 基类名 { private: 私有成员说明列表 protected: 保护成员说明列表 public: 公有成员说明列表 };
• 【例7.1】派生类示例 – 从Point类派生出Circle类
class Point { private: float x,y; public: void initPoint(float X, float Y) {x=X;y=Y;}//模仿构造函 数 //访问方法 void setX(float X) {x=X;} float getX() {return x;} void setY(float Y) {y=Y;} float getY() {return y;} void moveTo(Point newPoint) //业务方法 { x=newPoint.x;y=newPoint.y; } };

c课程设计含继承与多态

c课程设计含继承与多态

c课程设计含继承与多态一、教学目标本章节的教学目标旨在让学生掌握继承与多态的概念,理解其在编程中的应用,提高解决问题的能力。

具体目标如下:1.知识目标:a.理解继承的基本概念及其在面向对象编程中的作用。

b.掌握多态的原理,了解其在程序设计中的优势。

c.熟悉继承与多态在实际项目中的应用场景。

2.技能目标:a.能够使用编程语言实现简单的继承与多态。

b.具备分析问题、运用继承与多态解决问题的能力。

c.能对已有的代码进行修改,以优化程序结构,提高运行效率。

3.情感态度价值观目标:a.培养学生的团队协作精神,学会与他人分享和交流。

b.激发学生对编程的兴趣,提高自主学习的积极性。

c.培养学生勇于挑战、解决问题的自信心。

二、教学内容本章节的教学内容主要包括继承与多态的概念、原理及其在编程中的应用。

具体安排如下:1.继承的基本概念及其在面向对象编程中的作用。

2.多态的原理,以及如何在程序设计中利用多态。

3.继承与多态在实际项目中的应用场景,以及如何运用它们解决问题。

4.编程实践:使用编程语言实现继承与多态。

三、教学方法为了提高教学效果,本章节将采用多种教学方法,如讲授法、讨论法、案例分析法和实验法等。

具体方法如下:1.讲授法:通过讲解继承与多态的概念、原理和应用,使学生掌握基本知识。

2.讨论法:学生进行小组讨论,分享对继承与多态的理解,互相学习,共同进步。

3.案例分析法:分析实际项目中的继承与多态应用案例,让学生学会在实际问题中运用所学知识。

4.实验法:让学生通过编写代码,亲身体验继承与多态的实现,提高动手能力。

四、教学资源为了支持本章节的教学,我们将准备以下教学资源:1.教材:选用权威、实用的编程教材,为学生提供系统、全面的知识体系。

2.参考书:提供相关领域的参考书籍,丰富学生的知识储备。

3.多媒体资料:制作精美的PPT,直观地展示继承与多态的概念和原理。

4.实验设备:提供充足的计算机设备,确保学生能够顺利进行实验操作。

《C++程序设计教程》 第7章 继承与派生

《C++程序设计教程》  第7章  继承与派生

第7章 继承与派生
例7.1 (续一)
CLocation::CLocation(int x, int y) { CLocation::x = x; // 可以写成 this->x = x; CLocation::y = y; // 可以写成 this->y = y; } void CLocation::MoveTo(int x, int y) { CLocation::x = x; // 可以写成 this->x = x; CLocation::y = y; // 可以写成 this->y = y; } int CLocation::Getx() 可通过域运算符(::)访问类中的 { 成员x和y,与使用this指针有同样 return x; 作用 } int CLocation::Gety() { return y; }
第7章 继承与派生
例7.1 (续三)
void main(void) { CPoint p("Red"); p.Show(); p.MoveTo(7,8); p.Show(); p.SetColor("Green"); p.Show(); }
位置坐标通过CLocation类构造函 数的默认参数值设置为(0,0)
第7章 继承与派生
例7.1 (续二)
class CPoint : public CLocation //从CLocation中公有继承 { private: char Color[10]; public: CPoint(char *c); void SetColor(char *c); void Show(); }; CPoint::CPoint(char *c) { strcpy(Color,c); } 调用从CLocation类中继承来的成 void CPoint::SetColor(char *c) 员函数GetX()和GetY()。 { strcpy(Color,c); } void CPoint::Show() { cout << Getx() << "," << Gety() << " " << Color << endl ; }

01 面向对象程序设计C++继承与多态

01 面向对象程序设计C++继承与多态
5
IFLYTEK
public: // 输出自己的属性 void toString(ostream&);
};
面向对象程序设计语言 C++
Hour Employee 代码:
class HourEmployee { public:
string firstName; string lastName; // Social Security Number string ssn; // hourly wage double hourlyWage; // hours worked double hours; public: HourEmployee(); HourEmployee(string firstName, string lastName, string ssn, double hourlyWage, double hours); ~HourEmployee(); public: void toString(ostream&); };
根据上述分析,绘制出系统的类图。
根据类图,运用面向对象的思想编写代码,具体代码如下图。
Salaried Employee 代码:
class SalaryEmployee { public:
string firstName; string lastName; // Social Security Number string ssn; double weeklySalary; public: SalaryEmployee(); SalaryEmployee(string firstName, string lastName, string ssn, double weeklySalary); ~SalaryEmployee();

C++程序设计基础教程 第7章 继承与多态性

C++程序设计基础教程 第7章 继承与多态性

定义teacher类时,说明了访问权限department为公有、wage 为私有,而name、 year、month和day的权限是什么?
2019/2/22 江苏科技大学计算机学院 7
《C++程序设计基础教程》
第7章 继承与多态性
7.1 继承和派生 7.1.2 派生成员及其访问权限
1. 派生类中的成员 新增成员; 派生成员:从基类继承来的成员 基类中的所有数据成员(虚基类除外); 除构造函数和析构函数以外的其他成员函数。 name 访问权限 如: year ? 派生成员 month day teacher 定义时说明 wage 新增成员9/2/22
江苏科技大学计算机学院
9
《C++程序设计基础教程》
第7章 继承与多态性
7.1 继承和派生
公有派生时派生成员的访问权限
基类原有成员 派生成员权限 内部访问方式 外部访问方式 公有成员 公有成员 直接访问 直接访问 保护成员 保护成员 直接访问 间接访问 私有成员 私有成员 间接访问 间接访问
2019/2/22 江苏科技大学计算机学院 8
《C++程序设计基础教程》
第7章 继承与多态性
7.1 继承和派生 7.1.2 派生成员及其访问权限
2. 派生成员的访问权限 派生成员的访问权限由其在基类中的原有属性和派生方 式两个因素共同决定。 公有派生:派生成员的访问权限维持其在基类中的原有 属性不变; 私有派生:基类中的所有成员,派生后均变为私有成员; 保护派生 基类中原有的公有和保护成员,派生后变为保护成员; 原有的私有成员派生后仍为私有成员。
私有派生时派生成员的访问权限 基类原有成员 派生成员权限 内部访问方式 外部访问方式

C语言程序设计课件第07章继承与派生

C语言程序设计课件第07章继承与派生

访
rect.InitR(2,3,20,10);

rect.Move(3,2); cout<<rect.GetX()<<','<<rect.GetY()<<','

<<rect.GetH()<<','<<rect.GetW();
制}
13
class Rectangle: private Point
{ public:
void Function(); };
void B::Function() { x=5;
cout<<x<<endl; } void C::Function() { x=15;
cout<<x<<endl; } void main() { B b;
b.Function(); C c; c.Function(); }
16
#include<iostream> using namespace std; class A { protected:
int x; }; class B: protected A { public:
void Function(); }; class C: private B { public:

float GetY() { return Point::GetY();} float GetH() {return H;}

float GetW() {return W;}
制 private:
float W,H;
};
14
类 #include<iostream> 成 using namespace std;

C中的继承和多态

C中的继承和多态

C中的继承和多态1、引言继承和多态是面向对象语言最强大的功能。

有了继承和多态,我们可以完成代码重用。

在C中有许多技巧可以实现多态。

本文的目的就是演示一种简单和容易的技术,在C中应用继承和多态。

通过创建一个VTable(virtual table)和在基类和派生类对象之间提供正确的访问,我们能在C 中实现继承和多态。

VTable能通过维护一张函数表指针表来实现。

为了提供基类和派生类对象之间的访问,我们可以在基类中维护派生类的引用和在派生类中维护基类的引用。

2、说明在C中实现继承和多态之前,我们应该知道类(Class)在C中如何表示。

2.1、类在C中的表示考虑C++中的一个类"Person"。

//Person.hclass Person{private:char* pFirstName;char* pLastName;public:Person(const char* pFirstName, const char* pLastName); //constructor~Person(); //destructorvoid displayInfo();void writeToFile(const char* pFileName);};在C中表示上面的类,我们可以使用结构体,并用操作结构体的函数表示成员函数。

//Person.htypedef struct _Person{char* pFirstName;char* pLastName;}Person;new_Person(const char* const pFirstName, const char* const pLastName); //constructordelete_Person(Person* const pPersonObj); //destructorvoid Person_DisplayInfo(Person* const pPersonObj);void Person_WriteToFile(Person* const pPersonObj, const char* const pFileName);这里,定义的操作结构体Person的函数没有封装。

《继承和多态》课件

《继承和多态》课件
的属性和方法。
通过继承,子类可以扩展和定制 父类的功能,以满足特定的需求

继承的重要性
01
02
03
代码重用
通过继承,子类可以复用 父类的代码,避免重复编 写相同的代码。
扩展性
子类可以通过继承和重写 父类的方法来扩展其功能 ,实现更加灵活和可维护 的代码结构。
多态性
继承是实现多态的重要基 础,通过继承可以实现在 不同对象上调用相同方法 的行为。
VS
多态
多态可以使游戏中的对象表现出不同的行 为。例如,在动作游戏中,玩家可以使用 不同的武器进行战斗,每种武器都有自己 的攻击方式和效果。通过多态,可以使用 同一个攻击方法来处理不同武器的攻击效 果,从而实现不同的攻击效果。
THANKS
感谢观看
REPORTING
子类可以重写父类的 方法,通过使用 `@Override`注解来 标记。
子类可以使用 `extends`关键字来 指定要继承的父类。
继承的访问修Байду номын сангаас符
01
在Java中,类的访问修 饰符有`public`、 `protected`和`private` 三种。
02
03
当父类使用`public`修饰 符时,子类可以继承该 父类。
态多态性。
PART 05
继承和多态的应用场景
REPORTING
类的继承和多态的应用场景
类的继承
在面向对象编程中,子类可以继承父类的属性和方法,从而实现代码的重用和扩展。例如,在游戏开发中,可以 创建一个“动物”类,然后通过继承创建“狗”、“猫”等子类,子类可以继承“动物”类的属性和方法,同时 添加自己的特殊属性和方法。
当父类使用`protected` 修饰符时,子类只能在 同一包内继承该父类。

C继承与多态性.ppt

C继承与多态性.ppt

int main()
//基类Point类的声明
{ CRect rect;
class Point
rect.InitR(2,3,20,10);
{private:
//通过派生类对象访问基类公有成员
float X,Y;
rect.Move(3,2);
public:
cout <<rect.GetX()<<','
基类名
8
单继承派生类的声明格式:
class <派生类名> : <继承方式><基类名> {
<派生类新增加的数据成员> <派生类新增加的成员函数> };
多继承派生类的定义格式为:
class <派生类名> : <继承方式1><基类名1>,<继 承方式2><基类名2>,…
{ <派生类新增加的数据成员>
<派生类新增加的成员函数> };
CUserDoc CWinApp
CWnd
CView
CFrameWnd
CDialog
CUserApp
CUserView CMainFrame
CUserDialog
MFC关键类的层次体系
6
多继承:一个派生类继承两个或多个基类。
7
派生类的定义方法:
前例中,已声明过一个基类Student,在此 派生基类础名 上通过单继承建立一个派生类Student1。
方法二:在派生类声明同名成员——覆盖基类成 员。!!注意,对于成员函数,不仅要同名还要参数 个数和类型都相同。(请问,这是为什么?)

C++语言程序设计 第七章 继承性和派生类

C++语言程序设计 第七章 继承性和派生类

第七章 } void main() { B bb[2]; bb[0]=B(1,2,5); bb[1]=B(3,4,7); for(int i=0;i<2;<i++) bb[i].Print(); }
执行该程序输出结果如下 :
A's default constructor called. A's default constructor called. B's default constructor called. A's default constructor called. A's default constructor called. B's default constructor called.
class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2> class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>… 派生类名>:<继承方式 基类名1>,<继承方式 基类名2> {
< 派生类新定义成员 >
};
第七章
五、基类与派生类的关系: 基类与派生类的关系:
第七章
继承性和派生类
第七章
继承性是面向对象程序设计中重要机制之一 继承性是面向对象程序设计中重要机制之一。这 之一 种机制改变了过去传统的非面向对象程序设计中那种 对不再适合要求的用户定义数据类型进行改写甚至重 写的方法,克服了传统程序设计方法对编写出来的程序 克服了传统程序设计方法对编写出来的程序 无法重复使用而造成资源的浪费的缺点。 无法重复使用而造成资源的浪费的缺点。面向对象程 序设计的继承机制给我们提供了无限重复利用程序资 继承机制给我们提供了无限重复利用程序资 源的一种途径。 源的一种途径。通过C++语言中的继承机制,可以扩充 和完善旧的程序设计以适应新的需求,这样不仅可以节 省程序开发的时间和资源,并且为未来程序设计增添了 新的资源。

《C++语言程序设计》第7章 类的继承

《C++语言程序设计》第7章 类的继承

this->h = h;
}
void move(float offX, float offY) {
Point::move(offX, offY);
}
float getX() const { return Point::getX(); }
float getY() const { return Point::getY(); }
第 7 章 类的继承
2
目录
类的继承与派生概述 类成员的访问控制 基类与派生类类型兼容规则 派生类的构造、析构函数 派生类成员的标识与访问 小结
3
公有单继承举例
• 设计一个汽车类Vehicle,包含的数据成员有:车轮个数wheels和 车重weight。
• 小车类Car继承汽车类Vehicle ,其中包含的新属性为载人数 passenger。
int main() { Rectangle rect; //定义Rectangle类的对象 rect.initRectangle(2, 3, 20, 10); //设置矩形的数据 rect.move(3,2); //移动矩形位置 cout << "The data of rect(x,y,w,h): " << endl; cout << rect.getX() <<", " //输出矩形的特征参数 << rect.getY() << ", " << rect.getW() << ", " << rect.getH() << endl; return 0;
public:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
22
7.2 虚基类
7.2.1 派生关系中的二义性问题
在多继承时,基类与派生类之间,或 基类之间出现同名成员时,将出现访问 时的二义性(不确定性)—— 采用虚 函数或支配(同名覆盖)原则来解决。
当派生类从多个基类派生,而这些基 类又从同一个基类派生,则在访问此共 同基类中的成员时,将产生二义性—— 采用虚基类来解决。
{ 成员定义;
} 注意:每一个“继承方式”,只用于限制对紧
随其后之基类的继承。对于不指定继承方式的 ,系统默认为:private。
20
7.1.4 多继承
多重继承的构造函数和析构函数
• 其次序和单继承下的相同:基类的构造函 数->对象成员的构造函数->派生类的构造 函数
• 相同层次的各基类之间取决于在派生类中 声明时从左到右的顺序
ห้องสมุดไป่ตู้
派生类对象 可直接访问
g3
7.1.2 成员的继承及访问权限
派生类成员访问属性的调整
同名成员 访问声明
16
7.1.2 成员的继承及访问权限
同名成员
派生类中的成员名和基类中的成员名相同 ,基类中的就自动被忽略
成员名前加上基类名和作用域标识符“::” 访问声明
在子类中将一个或多个继承的成员恢复其 在基类中的访问权限
派生类中的成员函数可以直接访问基类中的 public和protected成员,但不能访问基类的 private成员。
通过派生类的对象只能访问基类的public成员。
11
7.1.2 成员的继承及访问权限
私有继承(private)
class 派生类名:private 基类名 {
成员定义; }
基类的public和protected成员以private身份出 现在派生类中,但基类的private成员不可访问。
基类中public 和 protected 成员在派 生类中具有private属性。 保护派生 (protected)
基类中public 和 protected 成员在派 生类中具有protected 属性。
14
7.1.2 成员
Class Base 私有:s
的继承及访 保护: b
问权限
公有: g 可直接访问
• 析构函数的执行顺序正好与上述顺序相反
21
7.1.5 基类对象与派生类对象的赋值关系
赋值兼容规则
在需要基类对象的任何地方都可以使用公 有派生类的对象来替代,替代有三种: 公有派生类对象可直接赋值给基类的对象,即
把派生类对象中从基类继承来的成员,逐个赋 值给基类对象的成员;反之,基类对象则不可 以赋给派生类对象。 公有派生类对象的地址可赋给基类指针变量。 公有派生类对象可以初始化基类引用。
定义
–以virtual修饰说明基类 例:class B1:virtual public B
作用
–主要用来解决多继承时可能发生的对同一基类 继承多次而产生的二义性问题.
–为最远的派生类提供唯一的基类成员,而不重 复产生多次拷贝
注意:
–在第一级继承时就要将共同基类设计为虚基类 27 。
7.3 虚函数与多态性
工具车
轿车
面包车
4
7.1 类的继承与派生
类的继承与派生的基本概念
所谓继承就是从父辈处得到属性和行为特征。类的 继承,是新的类从已有类那里得到已有的特征。从 另一个角度看,从已有类产生新类的过程就是类的 派生。
被继承的已有类称为基类(或父类)。 派生出的新类称为派生类。派生类同样也可以作为
基类派生新的类,这样形成类的层次结构。
8
7.1.2 成员的继承及访问权限
派生类不能继承的包括: 构造函数 析构函数 用户定义的new运算符 用户定义的赋值运算符 友员关系
9
7.1.2 成员的继承及访问权限
类和对象访问规则
类中三种不同属性的成员: 1) private :仅可在类中直接访问 2) public:可在类中直接访问, 亦可通过类
34
7.3.4 纯虚函数与抽象基类
定义:在基类中声明为虚函数,该基类 中不定义函数体。只声明,不实现。形 式: virtual 类型 函数名(参数表)=0
作用:对于暂时无法实现的函数,可以 声明为纯虚函数,派生类根据实际需要 定义自己的函数体。在基类中只定义其 名称和参数,可以统一实现。
35
7.3.4 纯虚函数与抽象类
s, b, g
Object abase 可直接访问
g
Class 保护继承同 私有继承
派生类对象 可直接访问
g, g2
15
Class 公有派生 私有:s2 保护: b2 公有: g2 可直接访问
b, g s2, b2, g2
Class 私有派生 私有: s3 保护: b3 公有: g3 可直接访问
b, g, s3,b3,g3
23
7.2.1 派生关系中的二义性问题
class A { public:
int a; void f(); //... }; class B { public: int a;
24
void f(); //...
}; class C:public A,public B { //... }; 二义性错误: C cobject; cobject.a=10; //出错,具有二义性 cobject.f(); //出错,具有二义性
的对象在类外访问 对象名.成员名
3) protected: 双重性
10
派生类中:public属性 在派生类中可直接访问
其他外部: private属性
7.1.2 成员的继承及访问权限
公有继承(public)
class 派生类名:public 基类名 {
成员定义; }
基类的public和protected成员的访问属性在派生 类中保持不变,但基类的private成员不可访问。
继承的目的:实现代码重用。
派生的目的:当新的问题出现,原有程序无法解决 (或不能完全解决)时,需要对原有程序进行改造 。5
7.1.1 派生类的定义
派生类的定义方法
class <派生类名>:<继承方式><基类名> { <派生类新定义成员>
};
7.1.2 成员的继承及访问权限
派生(Derive):以基类的定义为基础 ,以公有、私有或保护方式继承基类的 全部成员(数据成员和成员函数),另外 根据需要声明派生类的成员。
派生类中的成员函数可以直接访问基类中的 public和protected成员,但不能访问基类的 private成员。
通过派生类的对象不能访问基类中的任何成员。
12
7.1.2 成员的继承及访问权限
保护继承(protected)
class 派生类名:protected 基类名 {
成员定义; }
基类的public和protected成员都以protected身 份出现在派生类中,但基类的private成员不可访 问。
在对源程序进行编译时确定消息与哪个方法 相联系。如:函数名重载,运算符重载。
动态联编 —— 运行时多态性
在程序运行时确定将要消息与哪个方法相联 系。如:继承,虚函数。
29
7.3.2 虚函数及其应用
虚函数是面向对象编程实现多态的基本 手段。
从父类中继承的时候,虚函数和被继承 的函数要求具有相同的签名。在运行过 程中,运行系统将根据不同的对象类型 ,自动地选择所匹配的运行方式。
(1) 必须把动态联编的行为定义为类的虚函 数。 (2) 类之间存在子类型关系,一般表现为一 个类从另一个类公有派生而来。 (3) 必须先使用基类指针指向子类型的对象, 然后直接或者间接使用基类指针调用虚函数。
33
7.3.3 虚函数的定义及用法
使用虚函数需注意的问题
• 在类体系中访问虚函数,应使用指向基类类型的 指针或对基类类型的引用。
抽象类
• 抽象类包含未实现的函数,因此只能作其 它类的基类,不能实例化。
• 不能实例化,所以不能作为参数类型,函 数返回类型或显式类型转换的类型,但可 以声明抽象类的指针或引用。
• 类层次结构中包含未完全实现函数的类都 是抽象类。
• 抽象类中定义的普通函数,派生类对象可 以调用。
多态性是面向对象程序设计的重 要概念和机制,属于面向对象方 法的三大特性之一。
指的是发出同样的消息被不同类 型的对象接收时导致完全不同的 行为。
28
7.3.1 静态联编与动态联编
联编(binding):把函数名与其函数体的程 序代码连接在一起。更进一步,将符号与存 储地址联系在一起。
OOP中,把消息与方法联系在一起。 静态联编 —— 编译时多态性
引发的问题:
➢ 派生类中对基类成员属性的改变 ➢ 在派生类中定义构造函数及其它成员函
数时,基类构造函数和成员函数的影响
7
7.1.2 成员的继承及访问权限
不同继承方式的影响主要体现在
➢ 派生类成员对基类成员的访问控制 ➢ 派生类对象对基类成员的访问控制
继承方式
➢公有继承 public ➢私有继承 private ➢保护继承 protected
7.2.1 派生关系中的二义性问题
二义性的解决方法
解决方法一:用类名来限定(确定名域) 派生类对象.基类名::方法名()
C cobject; cobject.A::a=10; //正确 cobject.B::f(); //正确
25
7.2.1 派生关系中的二义性问题
二义性的解决方法
解决方法二:同名覆盖 在派生类中再定义一个同名成员函数f() ,该函数再根据需要调用:某个基类::f()
31
7.3.3 虚函数的定义及用法
相关文档
最新文档