复习7--继承与派生

合集下载

C语言程序设计PPT第七章继承与派生

C语言程序设计PPT第七章继承与派生
cout<<"C's constructor called."<<endl; } C::~C() { cout<<"C's destructor called."<<endl; } void C::Print() const { B::Print(); cout<<c<<endl; } int main() { C obj(5,6); obj.Print(); }
问 控 制
类中的public和protected成员,但 不能直接访问基类的private成员。
通过派生类的对象不能直接访问基类 中的任何成员
17
C++语言程序设计
protected 成员的特点与作用

成 对建立其所在类对象的模块来说,它
员 与 private 成员的性质相同。
的 对于其派生类来说,它与 public 成 访 员的性质相同。
public成员。
10
C++语言程序设计
例7-1 公有继承举例
类 成 员
class Point //基类Point类的声明 {public: //公有函数成员
void InitP(float xx=0, float yy=0)

{X=xx;Y=yy;}
访 void Move(float xOff, float yOff)
25
C++语言程序设计
多继承时派生类的声明

继 class 派生类名:继承方式1 基类名1,
承 继承方式2 基类名2,...
与{

成员声明;

第17讲(继承与派生)

第17讲(继承与派生)

第17讲教学内容7.1 类的继承与派生7.1.1继承与派生实例7.1.2 派生类的定义7.1.3派生类的生成过程7.2 访问控制7.2.1 公有继承7.2.2 私有继承7.2.3 保护继承教学重点和难点1什么叫继承?继承的作用?2派生类的声明方式3 三种继承方式下的访问控制的理解教学方法:通过举实际生活中的例子,讲解继承的概念通过程序举例演示,讲解如何产生一个派生类,以及三种继承方式下的访问控制的理解教学学时2 学时教学过程一继承概述:1什么叫继承?没有继承的话,类就只是带有相关行为的数据结构,不过继承还为编程语言增加了全新的元素。

通过继承,可以在现有类的基础上构件新类,这样,类就变成了可重用,可扩展的组件了。

现实世界中的对象一般都呈层次体系存在,也就是一种“is a”的关系。

在程序设计中,如果要在一个类之上构件另一个类,或者只是对一个了类做简单的修改来构件另一个类,就与这种关系有关。

要实现这个目的,一种途径积聚市把这个类的代码复制粘贴到另一个类,通过修改相关部分或者添加代码,就可以达到目的,创建一个与原来的类稍有不同的类。

但这种方法的缺点主要是:1)这种方法并没有建立真正的”is a”关系。

新类与原来的类相似,这只是新类共享了原来的代码,并不是因为新类与原类确实是同一个对象类型。

2)编译器并不知道两个类之间的关系,所以这两个类不是多态的----它们并非同一个事物的不同变种3)有时候并不能得到原始代码,原始代码或许只是以预编译的二进制格式存在,所以复制粘贴代码不太现实。

4)可以看到,这种复制加粘贴的方法经常容易出错误而且浪费时间,也会导致许多代码的物理拷贝残留在整个系统中,使代码维护工作困难重重。

那么,有没有一种方法,不需要复制代码,就可以“吸收”一个类的属性和行为,使其作为另外一个类的一部分?毫无疑问,C++对定义的真正的is a关系提供了内置支持。

继承关系构成了一种树状层次结构,基类和派生类之间存在着层次关系•类的继承是新的类从已有的类那里得到属性和行为,同时也可以加入新的特性。

继承与派生类PPT演示课件

继承与派生类PPT演示课件
第7章 继承与派生类
7.1 基本概念 7.2 派生类的三种继承方式 *7.3 多 重 继 承 与虚基类 习题
1
7.1 基本概念
1、继承与派生
继承是面向对象语言提供的一个重要机制,它在类与类之 间建立了层次关系。首先从下面的实例当中体会继承的概念。
class Box
{
private :
int width,height;
{…
};//同上
10
void main( )
{
ColorBox ob1;
ob1.SetWidth(1);
ob1.SetHeight(2);
ob1.SetColor(3);
ColorBox ob2;
ob2.Width = 1 ; //非法
ob2.color = 3; //×
}
如果在ColorBox内有另外一个成员函数,它能否
12
3、保护成员
用protected说明的成员称为保护成员,保护成员的访问 权限介于私有和公有之间。其规则为:
派生类的成员函数可以访问基类的保护成员,但是在基 类和派生类之外,程序不能访问类的保护成员。
class Box { protected :
int width,height; };
13
class ColorBox :public Box { private :
class Box
{
private :
int width,height;
public:
void SetWidth(int w) { width = w;}
void SetHeight(int h) {height = h;}
};
//同上

c++7继承与派生

c++7继承与派生

3
继承与派生问题举例
类 的 继 承 与 派 生
工具车
交通工具
汽车
小汽车
卡车
旅行车
轿车
面包车
4
继承与派生问题举例
类 的 继 承 与 派 生
动物
猴子


狮子
5

猎豹
类继承与派生问题举例 的 几何形状 继 承 与 派 生

矩形
6
类继承与派生问题举例 的 雇员 继 承 与 兼职技术人员 管理人员 派 生
15
例7-2 私有继承举例
类 成 员 的 访 问 控 制
16
class Rectangle: private Point //派生类声明 {public: //新增外部接口 void InitR(float x, float y, float w, float h) {InitP(x,y);W=w;H=h;} //访问基类公有成员 void Move(float xOff, float yOff) {Point::Move(xOff,yOff);} float GetX() {return Point::GetX();} float GetY() {return Point::GetY();} float GetH() {return H;} float GetW() {return W;} private: //新增私有数据 float W,H; };
29
派 生 继承时的构造函数 类 的 基类的构造函数不被继承,派生类中需要 构 声明自己的构造函数。 造 声明构造函数时,只需要对本类中新增成 、 员进行初始化,对继承来的基类成员的初 析 始化,自动调用基类构造函数完成。 构 派生类的构造函数需要给基类的构造函数 传递参数 函 数

7章_继承与派生

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. 在C++中,可以从一个类派生出另一个类,前者称为基类或父类,后者称为派生类或子类。

一个派生类可以从一个或多个基类派生。

从一个基类派生的继承称单继承,从多个基类派生的继承称多继承。

2. 单继承定义格式:class 派生类:继承方式基类{ 派生类新定义成员;};其中,“派生类”是从“基类”按指定的“继承关系”派生出的、新定义的一个类的名字。

“继承方式”有三种:(1)public 公有继承(2)private 私有继承(3) protected 保护继承3. 多继承定义格式:class 派生类:继承方式1 基类1,继承方式2 基类2,…{ 派生类新定义成员;};4. 公有继承:当派生类的继承方式是public继承时,基类的public和protected成员的访问属性在派生类中保持不变,而基类的private成员不可访问,即基类的public和protected成员分别作为派生类的public和protected成员,派生类的其他成员可以直接访问它们。

例1:class B{ private: int x; protected: int y; public: int z;…};class A:public B{ private: int a; protected: int b; public: int c;…}; A a;(1)类B是基类,有3个数据成员x、y、z,分别是private、protected、public属性。

类A是派生类,有3个数据成员a、b、c,分别是private、protected、public属性。

由于类A是从类B公有派生的,类B中的public、protected属性的成员可继承到类A中来,且保持原来的属性。

故类A中有5个数据成员,即a、b、c、y。

(2)可以通过类A的对象a直接访问public成员,即z和c,并不能访问a、b、y数据成员。

《继承与派生 》课件

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

第7章 继承和派生

第7章  继承和派生
12
例:7.3分析下列程序的结果:
class Base1 { public: Base1(int i ) { b1=i ; cout<<"Constructor of Base1."<<endl; }
void Print() const
private:
{ cout<<b1<<endl; }
int b1;
Member ( int i)
{ m=i ; cout<<"Constructor of Member."<<endl; } int GetM ( ) { return m; } private: int m; };
16
class Derived : public Base2, public Base1 ,public Base3
{ b1=i;
b2=j;
cout<<"Base's constructor called."<<b1<<","<<b2<<","<<endl;
} Base::~Base ( ) {cout<<"Base's }
destructor called."<<b1<<","<<b2<<","<<endl;
23
Base's destructor called.1,2,
27
§7.4多继承与虚基类
§7.4.1多继承中的二义性问题 产生二义性问题主要有两种情况: ㈠产生二义性问题的第一种情况如下例: 如P215图7.4(a) class Base1 { public: void fun(); };

C++程序设计复习资料整理 继承与派生

C++程序设计复习资料整理 继承与派生

C++ Inheritance继承和派生继承:一个新类从已有的类那里获得其已有特性已存在的类称为:新建立的类称为-派生:从已有的类产生一个新的子类声明派生类【继承就是继承已有特性,派生就是在继承的基础上加以修改,这样理解吧……】继承是从子类角度来讲的,是说子类从父类中继承得到某些属性…派生是从父类角度来讲的,是说父类派生出子类子类的对象同时也可以是父类的对象。

父类的公有函数继承到子类是否还是公有要看继承方式(权限约束)父类的变量(如int a;)如果子类有相同的名字(int a;),就会被子类覆盖掉,就是说子类里面只有一个int a;【还是可以调用父类的a,但是调用方式不一样.】其实是有的,调用方式要用域来标志,比如A派生出B,B里面就有两个变量a,用B::a就是自己的,用A::a就是父类的派生类不能继承:基类的析构函数、构造函数基类的赋值运算符基类的友元派生类可以增加:新的数据新的成员函数新的构造函数、析构函数新的友元C++访问控制-- private, public, protected可以被以下访问该类中的函数其友元函数PS。

该类的对象也不能直接访问可以被以下访问该类中的函数子类的函数其友元函数可以被以下访问该类中的函数子类的函数其友元函数通过该类的对象访问继承方式你要注意的就是,子类有子类自己的东西可以加进去,这个跟父类是不冲突的,是子类自己定义的,而从父类继承下来的属性服从下面的表格。

基类的私有成员不被继承公有继承不改变属性保护继承把基类的公有函数和保护函数改为保护私有继承把基类的公有函数和保护函数改为私有单继承和多继承单继承:多继承:直接继承和间接继承直接继承Employee是HourlyWorker的直接继承间接继承Employee是MinuteWorker的间接继承【就是类似祖孙是间接继承,父子是直接继承……】对…函数重写overriding:只用函数名做标志重写是替换原有函数,重载是允许存在参数表不同的同名函数fun被重写了要访问Base中的fun()要通过静态函数与非静态函数【我理解的就是作用域的不同】百度到的部分相关解释:C++规定赋值运算符“=”只能重载为类的非静态成员函数,而不可以重载为类的友元函数。

cc07继承与派生

cc07继承与派生

8
3 种继承方式
类 成 员

▪ 不同继承方式的影响主要体现在:
▪ 派生类成员函数对基类成员的访问控制。 ▪ 外部代码对基类成员的访问控制。
访

控 制
从基类继承 过来的成员
公有 私有 保护 成员 成员 成员
外 部 代 码
访问控制
新增成员代码
9
公有继承(public)
类 ▪公有派生——
成 ▪原基类中的
2
继承与派生问题举例


交通工具


汽车


小汽车
卡车
旅行车

工具车
轿车
面包车
3
继承与派生问题举例
类 的
动物




猫科





猎豹
4
继承与派生问题举例

的 继
几何形状





矩形
5
继承与派生问题举例
类 的 继
承 与 派 兼职技术人员

雇员
管理人员
销售人员
销售经理
6
继承与派生的目的

的 ▪ 继承的目的——实现代码重用。
rect.InitR(2,3,20,10);
rect.Move(3,2);
cout<<rect.GetX()<<','
<<rect.GetY()<<','
<<rect.GetH()<<','

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;

《继承和派生》课件

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

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

2019C语言程序设计课件第07章继承与派生.ppt
class 派生类名:继承方式 基类名1
{
成员声明;
}
6
继承方式
类 成 员 的 访 问 控 制

不同继承方式的影响主要体现在:
– 派生类成员对基类成员的访问权限 – 通过派生类对象对基类成员的访问权限

三种继承方式
– 公有继承 – 私有继承 – 保护继承
7
公有继承(public)
类 成 员 的 访 问 控 制
14
类 成 员 的 访 问 控 制
பைடு நூலகம்
class Rectangle: private Point { public: void InitR(float x, float y,float w, float h) {InitP(x,y);W=w;H=h;} void Move(float xOff, float yOff) { Point::Move(xOff,yOff);} float GetX() { return Point::GetX();} float GetY() { return Point::GetY();} float GetH() {return H;} float GetW() {return W;} private: float W,H; };
13
类 成 员 的 访 问 控 制
#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(); }

《继承和派生》PPT课件

《继承和派生》PPT课件

完整版ppt
15
继承和派生
练习、设计一个圆类,从圆派生圆柱(或圆 锥),并设计成员函数输出圆柱(或圆锥) 的底面面积和体积。
完整版ppt
16
继承关系中构造函数之间的关系
• 派生类不继承基类的构造函数 • 派生类和基类的构造函数之间是一种自动调用的
关系 • 创建派生类对象时,派生类构造函数要调用基类
成员M基类中的存取权 成员M 在private继承后

的派生类的存取权限
public
private
protected
private
private
隐藏
完整版ppt
12
受保护继承(protected)和派生
• 基类中公有成员和受保护成员被继承后都是受 保护的
成员M基类中的存取权限 成员M 在protected继承后 的派生类的存取权限
性和行为 • 派生类可以修改继承的属性和行为 • 派生类可以增加新的属性和行为 • 派生类对象也是基类对象 • 派生类对象和基类对象可以被统一管理
完整版ppt
4
继承和派生的基本概念
基类
数据成员 函数成员
派生类
基类
数据成员 函数成员
自己的数据成员 自己的函数成员
完整版ppt
5
继承的意义
• 便于管理系统中的对象 • 系统扩充比较容易- 利用程序代码的再用性
继承和派生
继承和派生的基本概念 单一继承定义 派生类重定义基类函数 基类中成员被继承后存取权限等级的变化 继承关系中构造函数、析构函数之间的关
系 多重继承
完整版ppt
1
继承的例子
• 家具和柜子 • 建筑和房子 • 道路和高速公路 • 动物和猫 • 电视和彩色电视 • 电脑和笔记本电脑

第七章 派生和继承

第七章 派生和继承

class Student:public Person { protected: char sex[2]; char cname[10]; public: void getdata() { Person::getdata(); cout<<" 性别:"; cin>>sex; cout<<" 班号:"; cin>>cname; } void dispdata() { Person::dispdata(); cout<<" 性别:"<<sex<<endl; cout<<" 班号:"<<cname<<endl; } };
Person Teacher Student Unstudent Mistudent
class Person { protected: int no; //编号 char name[10]; //姓名 public: void getdata() { cout<<" 编号:"; cin>>no; cout<<" 姓名:"; cin>>name; } void dispdata() { cout<<" 编号:"<<no<<endl; cout<<" 姓名:"<<name<<endl; } };
//object.h class object { protected: char type[10]; char color[10]; public: object(char *t,char *c) { strcpy(type,t); strcpy(color,c); } };

继承和派生复习

继承和派生复习

继承和派生练习一、选择题1、关于保护继承,下列说法错误的是()。

A、保护继承的特点是基类的所有公用成员和保护成员都成为派生类的保护成员。

B、派生类对象不能访问基类中的任何成员。

C、派生类的对象可以访问基类的公有成员。

D、保护继承的派生类和私有继承的派生类,对基类成员访问属性是相同的。

2、关于私有继承,下列说法错误的是()。

A、基类的公有成员和保护成员被继承后作为派生类的私有成员,派生类的其他成员可以直接访问他们。

B、基类的公有成员和保护成员被继承后作为派生类的私有成员,派生类的其他成员不能直接访问他们。

C、基类的私有成员,派生类的成员和派生类的对象都无法访问。

D、派生类的对象无法访问基类的所有成员。

3、在公有继承中,基类中的保护成员作为派生类的()。

A、公有成员B、私有成员C、保护成员D、私有成员函数4、基类()在派生类中的性质和继承的性质一样。

A、公有成员B、私有成员C、保护成员D、私有成员函数5、派生类的对象对它的基类成员中的()是可以访问的。

A、公有继承的公有成员B、公有继承的私有成员C、公有继承的保护成员D、私有继承的私有成员6、C++类体系中,不能被派生类继承的有()。

A、构造函数B、虚函数C、静态成员函数D、赋值操作函数7、下列说法错误的是()。

A、公有继承的基类中的public成员在派生类中仍是public的B、公有继承的基类中的private成员在派生类中仍是private的C、私有继承的基类中的public成员在派生类中变成private的D、保护继承的基类中的public成员在派生类中变成protected的8、下列对继承的描述中,错误的是()。

A、析构函数不能被继承B、派生类也是基类的组合C、派生类的成员除了它自己的成员外,还包含了它的基类的成员D、派生类中继承的基类成员的访问权限到派生类保持不变9、下列对基类和派生类关系的描述中,错误的是()。

A、派生类是基类的具体化B、派生类是基类的子集C、派生类是基类定义的延续D、派生类是基类的组合10、C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。

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

复习题7
1.在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。

对两个有相同名字的数据成员进行访问时,如果没有作用域分隔符限定,对此数据成员的访问将出现歧义。

2.在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。

对两个有相同名字的数据成员进行访问时,如果没有作用域分隔符限定,对此数据成员的访问将出现歧义。

3.类的继承是指子类继承基类的___数据成员_____和成员函数。

4.在保护派生中,基类权限为Private的成员在派生类中_不能直接访问___。

5. this指针存在的目的是( B)
A.保证基类公有成员在子类中可以被访问
B.保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码
C.保证基类保护成员在子类中可以被访问
D.保证基类私有成员在子类中可以被访问
6.在哪种派生方式中,派生类可以访问基类中的protected成员( B)
A.public和private B.public和protected
C.protected和private D.仅protected
7. 第7章习题:1;2;4;8。

相关文档
最新文档