继承与派生类
继承与派生
4.1 继承和派生的概念
在软件开发过程中,在定义特殊类时,不需把它的一 般类已经定义过的属性和服务重复地书写一遍,只需要声 明它是某个类的特殊类,并定义它自己的特殊属性和服务。 这将明显地减轻开发工作的强度。 4.1.2 继承的作用 面向对象程序设计的继承性使得大型应用程序的维护 和设计变得更加简单。一方面,大型应用程序设计完成并 交付使用后,经常面临用户的需求发生变化,程序功能需 要扩充等问题。这时程序的修改需要非常谨慎,因为某个 局部的修改可能会影响其他部分,而一个正在使用中的系 统要进行全面的测试,既费时间又有很多实际的困难。另 一方面,一个新的应用系统程序设计在许多方面会和以前 设计过的某个或某些系统的模块非常类似,怎样加快大型 应用程序的开发速度,重用这些已经开发成功的程序模块, 一直是软件设计中迫切需要解决的问题。
4.2 派生类
C++语言派生类多重继承的定义格式如下: class <派生类名>:[继承方式1] [<基类名1>],[继承 方式2] [<基类名2>],…, [继承方式n] [<基类名n>] { <派生类成员变量和成员函数定义> }; 通常,在多重继承时,继承方式设计成一致的形式。 如继承方式均设计成public,或均设计成private。
第5章 继承与派生-Qt C++跨平台图形界面程序设计基础(第2版)-殷立峰-清华大学出版社
protected:
};
string name;
int age;
char sex;
};
class Person{
class Employee: public Person {
public:
public:
void print( ) {
cout<<“name:”<<name<<endl; cout<<“age:”<<age<<endl;
cout<<"salary="<<salary<<endl; } ~Employee() { delete []name; } private: char *name; short age; float salary; };
//定义派生类Manager class Manager: public Employee { public:
void set_level(int l=0) {
level = l; } void Print_level() {
cout<<"level:"<<level<<endl; }
int main() {
Employee e("lihua",30,3000); e.Print(); Manager m; m.set_level(1); m.Print();
{
<<endl;
cout<<“name:”<<name<<endl; cout<<“age:”<<age<<endl; cout<<“sex:”<<sex<<endl; }
继承和派生的作用
继承和派生的作用继承和派生是面向对象编程中常用的两个概念,它们在软件开发中起着重要的作用。
继承是指一个类从另一个类继承属性和方法的过程,派生是指在继承的基础上创建新的类的过程。
本文将分别介绍继承和派生的作用。
一、继承的作用1. 代码复用:通过继承,子类可以继承父类的属性和方法,避免了重复编写相同代码的麻烦。
这样可以提高代码的复用性,减少了代码量,提高了开发效率。
2. 继承关系的表达:通过继承,可以清晰地表达类与类之间的关系。
子类继承了父类的属性和方法,说明它们之间有某种联系,有共同的特征或行为。
3. 扩展功能:通过继承,子类可以在父类的基础上新增或修改属性和方法,实现功能的扩展。
这样可以满足不同的需求,增加了代码的灵活性。
4. 统一接口:通过继承,可以定义一个抽象的父类,然后定义多个子类来实现具体的功能。
这样可以实现统一的接口,使代码更加规范和易于管理。
5. 多态性的实现:继承是实现多态性的基础。
子类可以替代父类的位置,通过父类的引用来调用子类的方法。
这样可以实现动态绑定,提高了代码的灵活性和可扩展性。
二、派生的作用1. 创建新的类:派生是在继承的基础上创建新的类的过程。
通过派生,可以基于已有的类创建新的类,并在新的类中添加、修改或重新实现属性和方法。
2. 特化和泛化:通过派生,可以根据具体的需求创建特定的类。
例如,可以从一个通用的动物类派生出狗类和猫类,使它们具有更具体的属性和方法。
同时,也可以从一个具体的类派生出一个更通用的类,使它具有更广泛的适用性。
3. 继承关系的传递:通过派生,可以传递继承关系。
即子类可以继续被其他类所派生,形成更深层次的继承关系。
这样可以实现更复杂的类之间的继承和关联。
4. 重载和重写:通过派生,可以重载和重写父类的方法。
重载是指在子类中定义一个与父类同名但参数列表不同的方法,以实现不同的功能。
重写是指在子类中重新定义一个与父类同名同参数列表的方法,以实现不同的行为。
第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中,从教师类和干部类派生出 校长类,即校长类有两个基类。
第5章 派生类与继承
void print();
};
print();
};
//定义一个基类 class person{ protected: char name[10]; int age; char sex; public: //…… }; //定义一个派生类 class employee:public person { protected: char department[20]; float salary; public: //…… };
当类的继承方式为私有继承时,基类的public成员和 protected成员被继承后作为派生类的private成员,派生类 的其他成员可以直接访问它们,但是在类外部通过派生类的 对象无法访问。
基类的private成员在私有派生类中是不可直接访问的, 所以无论是派生类成员还是通过派生类的对象,都无法直接 访问从基类继承来的private成员,但是可以通过基类提供 的public成员函数间接访问。 例5.1一个私有继承的例子
由于派生类继承了基类的成员,派生类的构造 函数需要调用基类的构造函数对其中定义于基 类的数据成员进行初始化。 给基类构造函数传递实际参数是通过向派生类 构造函数传递实际参数以及初始化列表来间接 实现传递的。
5.2.1 派生类构造函数和析构函数的执行顺 序 通常情况下,当创建派生类对象时, 首先执行基类的构造函数,随后再执行 派生类的构造函数; 当撤消派生类对象时,则先执行派生 类的析构函数,随后再执行基类的析构 函数。
例5.3 公有继承的访问规则
表5-3 公有继承的访问规则
基类成员 内部访问 对象访问 Private成员 不可访问 不可访问 public成员 可访问 可访问 protected成员 可访问 不可访问
继承与派生类答案
继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握private,public,protected三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
继承与派生类答案
继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握private,public,protected三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。
C++程序设计04737 第5章 类的继承与派生
5.1 类的继承与类的派生
5.1.2 派生类的定义与大小
2.类的大小
1. //[程序5-2]基类与子类占用空间及字节对齐
2. #include <iostream>
3. using namespace std;
4. class BaseClass //基类
5. {
6.
int v1, v2;
7.
派生类中包含了基类的成员变量,且基类
成员变量在前,派生类成员变量在后。基 类占用了12个字节,在此之后要分配派生 类自身的成员变量,一个int型变量和一个 指针变量。在64位系统中,指针占8个字 节。所以派生类的大小=12+4+8=24字节。 32位系统中指针的大小是4字节。
5.1 类的继承与类的派生
5.1 类的继承与类的派生
5.1.3 继承关系的特殊性
//[程序5-3]派生类继承了友元函数
#include <iostream>
using namespace std;
class another;//前向引用声明
class Base//基类
{private: float x;
public: void print(const another &K);};
d.print(ano);//输出: Base: 100
return 0;
}
如果派生类Derived中重写了print(),若还想在函数中访问another的私有成员,则必须将类Derived的print()函数也
声明为another的友元。在类another中需要添加如下声明:
friend void Derived::print(const another &K);//派生类的成员函数声明为本类的友元
派生与继承
继承与派生
(2)改造。改造是指对吸收进来的基类成员的改 改造。 改造 造。它包括两个方面:一个是对基类成员访问 它包括两个方面: 控制的调整, 控制的调整,它是通过派生类定义时的继承方 式来确定。另一个就是对基类成员的隐藏, 式来确定。另一个就是对基类成员的隐藏,即 在派生类中声明一个与基类成员同名的新成员, 在派生类中声明一个与基类成员同名的新成员, 这个新成员就隐藏了上层的所有同名成员。 这个新成员就隐藏了上层的所有同名成员。这 时,在派生类中或者通过派生类的对象来直接 使用该成员名, 使用该成员名,就只能访问到派生类中声明的 同名成员,这称为同名隐藏或同名覆盖。 同名成员,这称为同名隐藏或同名覆盖。
继承与派生
继承性的具体实现也就是一个派生类的建立过程。 继承性的具体实现也就是一个派生类的建立过程。 class 派生类名 : 继承方式 基类名 继承方式 基类名 基类名1, 基类名2, … , 继承方式 基类名 基类名n { 新增派生类成员声明; 新增派生类成员声明 }; 继承方式关键字有三个: 继承方式关键字有三个:public、private、protected。 、 、 。 继承方式关键字只对紧随其后的基类起作用。 继承方式关键字只对紧随其后的基类起作用。 在继承与派生的过程中,一个基类可以派生出多个派生类, 在继承与派生的过程中,一个基类可以派生出多个派生类, 每一个派生类又可以作为基类再派生出新的派生类, 每一个派生类又可以作为基类再派生出新的派生类,基类和 派生类是相对而言的。这样,一代一代地派生下去, 派生类是相对而言的。这样,一代一代地派生下去,就形成 了一个相互关联的有层次的类的家族,称为类族。在类族中, 了一个相互关联的有层次的类的家族,称为类族。在类族中, 作为上下层直接联系而参与派生出某类的基类称为该派生类 的直接基类, 的直接基类,而基类的基类甚至更高层的基类则称为间接基 类。
第4章 派生类与继承
如:
class employee:public person{ char department[20]; float salary; public: //… };
Previous Next Back
5
派生方式
1. 私有派生
class employee:private person{ //… };
//部门 //工资
直接定义employee类,代码重复非常严重。 使用继承:将employee说明成person类的派生类。 增加新的数据成员department和salary; 修改print成员函数。
Previ:
class 派生类名:派生方式 基类名{ //派生类新增的数据成员和成员函数 };
class B{ public: void setB(int x){ b=x; } void showB(){ } private: int b; };
class C : public A, private B{ public: void setC(int x, int y, int z) { //直接访问基类的公有成员 setA(x); setB(y); c=z;} void showC(){ } private: int c; }; void main() { C obj; obj.setA(5); obj.showA( ); obj.setC(6,7,9); obj.showC( ); obj.setB(6); //错误 obj.showB(); //错误 }
公有派生
class employee:public person{ //… }; public
基类
private a fun1() public c fun2() private
第5章 类的派生与继承
第5章 类的派生与继承
class BaseClass //基类 {
int vl,v2; }; class DerivedClass : public BaseClass //派生类 {
int v3; };
第5章 类的派生与继承
二、派生类的定义与大小 1、派生类的定义 从基类派生派生类的一般格式: class派生类名:继承方式说明符 基类名 {
编程小技巧:同学们可以将鼠标放置于类中的任何一个成 员或者函数上,编程软件会提示,对应的访问权限,这个方法在 继承编程中特别好用。
第5章 类的派生与继承
我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则: 公有继承(public):当一个类派生自公有基类时,基类的公
第5章 类的派生与继承
C++程序设计
第5章 类的派生和继承
第5章 类的派生与继承
本章内容
类的继承与类的派生 访问控制 派生类的构造函数和析构函数 类之间的关系 多层次派生 基类与派生类指针的相互转换
第5章 类的派生与继承
第一节 类的继承与类的派生
常考知识点: 继承派生基本概念 继承派生在C++中起到的作用 派生类定义的方法 派生类从基类继承的元素有哪些 继承关系中友元和静态成员变量的派生特点 单继承、多重继承的概念以及异同 派生的层次
第5章 类的派生与继承
1、继承:在一个已存在的类的基础上建立一个新的类,称 为继承
2、派生:从已有的类(父类)产生一个新的子类,称为类的 派生
3、单继承:一个派生类只从一个基类派生,这称为单继承 4、多继承:一个派生类有两个或多个基类的称为多重继承
第五章 类的继承与派生
//save as car.h #include "vehicle.h" class car : public vehicle { //派生类car(轿车) public: void setcar(int aw, int ats, float ap, int anc, int ahp) {setvehicle(aw,ats,ap); //调用基类的函数初始化 numbercylinders=anc; horsepower=ahp; } void print( ) { //重定义print( ) vehicle::print( ); //调用基类的函数 cout << "\n cylinders:" << numbercylinders; cout << "\n horsepower:" << horsepower;} private: int numbercylinders; //汽缸数 int horsepower; //马力 };
子类特有的部分
子类名
public、protected 和 private分别表示公有继承、保护 继承和私有继承,定义派生类时三选一。
7
第五章 类的继承与派生
(3)说明 ①public继承 最常见的派生方式。基类成员的访问权限在派生类中保 持不变,派生类成员函数不可直接访问基类的private成员, 可通过基类的公有成员函数或保护成员函数访问。 ②private继承 基类中的所有成员在派生类中都将变为private成员。 派生类成员函数不可直接访问基类的private成员,但可直 接访问基类的public、protected成员,并通过它们访问基 类的private成员。 ③protected继承 基类的public成员在派生类中变为protected成员,基类 的protected和private成员在派生类中保持原来的访问权限。 8
第八章 继承与派生
一般来说,公有派生是绝对主流。
公有派生与私有派生
1. 公有继承(public)。 公有继承的特点是基类的公有成员和保护成员作为派生 类的成员时,它们都保持原有的状态,而基类的私有成员仍 然是私有的。 2. 私有继承(private)。 私有继承的特点是基类的公有成员和保护成员作为派 生类的私有成员,并且不能被这个派生类的子类访问。
基类 派生类 基类 public public Protected protected private private private 不可见 private 派生 派生类 protected 基类 public protected private 派生类 public proteced
不可见
不可见
在派生类对象外 访问派生类对象 的基类成员
可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问
公有派生
私有派生
(1)在公有继承时,派生类的对象可以访问基类中的公有成 员;派生类的成员函数可以访问基类中的公有成员和保护成员。 这里,一定要区分清楚派生类的对象和派生类中的成员函数对 基类的访问是不同的。 (2)在私有继承时,基类的成员只能由直接派生类访问,而 无法再往下继承。
继承与派生的概念 派生类的构造函数与析构函数 多重继承与派生类成员标识 虚基类 类层次中成员名的作用域 类层次中类转换规则 多重继承的应用例子 MFC基础类及其层次结构
继承与派生的概念
层次概念是计算机的重要概念。通过继承(inheritance)的 机制可对类(class)分层,提供类型/子类型的关系。C++通过 类派生(class derivation)的机制来支持继承。继承是类之间定 义的一种重要关系。定义类B时,自动得到类A的操作和数据属性, 使得程序员只需定义类A中所没有的新成分就可完成在类B的定义, 这样称类B继承了类A,类A派生了类B,A是基类(父类),B是 派生类(子类)。这种机制称为继承。 称已存在的用来派生新类的类为基类(base class) ,又称 为 父 类 。 由 已 存 在 的 类 派 生 出 的 新 类 称 为 派 生 类 ( derived class) ,又称为子类。派生类可以具有基类的特性,共享基类 的成员函数,使用基类的数据成员,还可以定义自己的新特性, 定义自己的数据成员和成员函数。基类和派生类的集合称作类继 承层次结构(hierarchy) 在C++语言中,一个派生类可以从一个基类派生,也可以从 多个基类派生。从一个基类派生的继承称为单继承;从多个基类 派生的继承称为多继承。下图反映了类之间继承和派生关系。
C++面向对象程序设计第8章 继承与派生
蚌埠学院计算机系
C++面向对象程序设计
class Studend1 可以看出,很多是重复的地方, 我们可以通过C++语言中的 { int num; //此行原来己有 继承机制,可以扩充和完善旧 char name[20]; //此行原来己有 的程序设计以适应新的需求。 char sex; //此行原来己有 这样不仅可以节省程序开发的 时间和资源,并且为未来程序 int age; 增添了新的资源。 char addr[20]; public: void display( ) ; //此行原来己有 {cout<<"num: "<<num<<endl; //此行原来己有 cout<<"name: "<<name<<endl;//此行原来己有 cout<<"sex: "<<sex<<endl; //此行原来己有 cout<<"age: "<<age<<endl; cout<<"address: "<<addr<<endl;} };
蚌埠学院计算机系
21
C++面向对象程序设计
【例8-3】定义类Point,然后定义类Point的派生类 Circle。 #include <iostream.h> class Point //定义基类,表示点 { private: int x; int y; public: void setPoint(int a, int b){ x=a; y=b; }; //设置坐标 int getX(){ return x; }; //取得X坐标 int getY(){ return y; }; //取得Y坐标 };
8 继承与派生
实现了数据隐藏,又方便继承,实现代码重用。
8.2 访问权限控制
例 如,
class A { protected: int x; } int main( ) { A a; a.x=5; //错误 }
8.2 访问权限控制
一、公有继承的访问权限控制
• 基类的public和protected成员的访问属性在派生类中保持不变,但基类 的private成员不可访问。 • 派生类中的成员函数可以直接访问基类中的public和protected成员,但
不能访问基类的private成员。
• 通过派生类的对象只能访问基类的public成员。
之间具有一定的语义连接关系,该关系表达了类之间的一种相关性。 B. 依赖(Dependency)关系 描述的是两个类之间的语义上的连接关系,它是一种“Use-A”关系。 假设有两个元素A与B,如果修改元素A的定义可能会引起对另一个元
素B的定义的修改,则称元素B依赖于A。
8.1 基本概念
C. 聚合(Aggregation)关系 聚合关系是一种“Has-A”关系,体现的是类之间的一种整体与部分的 关系。例如汽车包括四个轮子和一个发动机等。 D. 泛化(Generalization )关系 泛化关系是一种“Is-A”关系,描述类之间的“一般”与“特殊”的关 系。具有共同特性的元素可以抽象为一般类,并通过增加其内涵,进
(1).通过派生类定义时的继承方式来控制。
(2).定义同名成员屏蔽基类成员。 3. 添加派生类新成员 根据需要,在派生类中添加新成员,保证派生类在功能上有所发展。
8.1 基本概念
派生类是基类的具体化 类的层次通常反映了客观世界中某种真实的模型。
派生类是基类定义的延续
先定义一个抽象基类,该基类中有些操作并未实现。 派生类是基类的组合 在多继承时,一个派生类有多于一个的基类,这时派生类将是所有基 类行为的组合。
《C++程序设计》电子教案第5章 继承和派生
// 使用基类成员i,j
// 使用基类成员i,j
4.私有继承和保护继承
私有继承:派生类对基类的私有继承使用关键 字private描述(可缺省),基类的所有公有段 和保护段成员都成为派生类的私有成员。 保护继承:派生类对基类的保护继承使用关键 字protected描述,基类的所有公有段和保护段 成员都成为派生类的保护成员,保护继承在程 序中很少应用。
常用的三种继承方式:
1.公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类 的成员时,它们都保持原有的状态,而基类的私有成员 仍然是私有的。 2.私有继承(private) 私有继承的特点是基类的公有成员和保护成员作为派生类 的私有成员,并且不能被这个派生类的子类访问。 3.保护继承(protected) 保护继承的特点是基类的所有公有成员和保护成员都成为 派生类的保护成员,并且只能被它的派生类成员函数或 友元访问,基类的私有成员仍然是私有的。
第5章 继承和派生
5.1 5.2 5.3 5.4
基类和派生类 单继承 多继承 虚基类
5.1 基类和派生类
5.1.1 5.1.2 5.1.3 5.1.4
派生类的定义格式 派生类的三种继承方式 访问控制 基类和派生类的关系
返回首页
称已存在的用来派生新类的类为基类,又称为 父类。由已存在的类派生出的新类称为派生类, 又称为子类。派生类可以具有基类的特性,共 享基类的成员函数,使用基类的数据成员,还 可以定义自己的新特性,定义自己的数据成员 和成员函数。
public: void initr(float x,float y,float w,float h) { initp(x,y); //调用基类的公有成员 W=w;H=h; } float getH(){return H;} float getW(){return W;} private: float W,H; }; void main() { rectangle rect; rect.initr(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; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。
(1)掌握继承的两种类型:单继承和多继承。
(2)掌握private,public,protected三种继承方式的特点。
继承方式决定了基类中的成员在派生类中的属性。
三种继承方式的共同点:基类的private成员在派生类中不可见。
区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。
(3)掌握派生类中的构造函数和析构函数的使用。
基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。
派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。
(4)掌握派生类的同名覆盖规则。
(5)掌握赋值兼容规则。
基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。
2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。
派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。
3.掌握虚基类的概念和定义方法。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
2 典型题1:下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变2:派生类的对象对它的哪一类基类成员是可以访问的?()A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员 C. 公有继承的基类的私有成员 D. 保护继承的基类的公有成员3:关于多继承二义性的描述,()是错误的。
A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性4:多继承派生类构造函数构造对象时,()被最先调用。
A.派生类自己的构造函数B.虚基类的构造函数C.非虚基类的构造函数 D.派生类中子对象类的构造函数5: C++类体系中,能被派生类继承的是()。
A.构造函数 B.虚函数 C.析构函数 D.友元函数6:设有基类定义:class Cbase{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员( )A. 私有继承B.保护继承C. 公有继承D.私有、保护、公有均可7:C++将类继承分为(1) 和(2) 两种。
8:派生类可以定义其_______________中不具备的数据和操作。
9:派生类构造函数的初始化列表中包含____________________________。
10:设有以下类的定义:class A class B: protected A class C: private B{ int A1; { int b1; { int c1;protected: int A2; protected: int b2; protected: int c2;public: int A3; public: int b3; public: int c3;}; }; };请按访问权限写出派生类C中具有的成员。
私有成员:(1)保护成员:(2)公有成员:(3) 。
11:指出并改正下面程序中的错误。
#include<iostream.h>class Point{ int x,y;public:Point(int a=0,int b=0) {x=a; y=b;}void move(int xoffset,int yoffset) {x+=xoffset; y+=yoffset;} int getx() {return x;}int gety() {return y;}};class Rectangle:protected Point{ int length,width;public:Rectangle(int x,int y,int l,int w):Point(x,y){ length=l;width=w;}int getlength(){return length;}int getwidth(){return width;}};void main(){ Rectangle r(0,0,8,4);r.move(23,56);cout<<r.getx()<<","<<r.gety()<<","<<r.getlength()<<","<<r.getwidth()<<endl;}12:指出并改正下面程序中的错误。
#include<iostream.h>class A{ public:int x;A(int a=0) {x=a;}void display() { cout<<"A.x="<<x<<endl; }};class B{ public:int x;B(int a=0) {x=a;}void display() {cout<<"B.x="<<x<<endl; } };class C:public A,public B{ int y;public:C(int a,int b,int c) :A(a),B(b){ y=c; }int gety() { return y; }};void main(){ C myc(1,2,3);myc.x=10;myc.display();}13:看程序写结果#include <iostream.h>class Base{ int i;public:Base(int n){cout <<"Constucting base class" << endl;i=n;} ~Base(){cout <<"Destructing base class" << endl;}void showi(){cout << i<< ",";}int Geti(){return i;}};class Derived:public Base{ int j;Base aa;public:Derived(int n,int m,int p):Base(m),aa(p){cout << "Constructing derived class" <<endl;j=n;}~Derived(){cout <<"Destructing derived class"<<endl;}void show(){Base::showi();cout << j<<"," << aa.Geti() << endl;}};void main(){ Derived obj(8,13,24);obj.show();}14:看程序写结果#include<iostream.h>class A{ public:A(char *s) { cout<<s<<endl; }~A() {}};class B:virtual public A{ public:B(char *s1, char *s2):A(s1){ cout<<s2<<endl; }};class C: virtual public A{public:C(char*s1,char *s2):A(s1){cout<<s2<<endl;}};class D:public B,public C{public:D(char *s1, char *s2,char *s3, char *s4):B(s1,s2),C(s1,s3),A(s1) {cout<<s4<<endl;}};void main(){D *p=new D("class A","class B","class C","class D");delete p;}15:建立一个基类Building ,用来存储一座楼房的层数、房间数以及它的总平方英尺数。
建立派生类Housing,继承Building,并存储下面的内容:卧室和浴室的数量,另外,建立派生类Office,继承Building,并存储灭火器和电话的数目。
然后,编制应用程序,建立住宅楼对象和办公楼对象,并输出它们的有关数据。
3 习题分析与解答1.选择题(1)C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。
A.复用B.继承C.封装D.引用(2)继承具有(),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。
A)规律性 B.传递性 C.重复性 D.多样性(3)下列对基类和派生类关系的描述中,错误的是()。
A.派生类是基类的具体化B.派生类是基类的子集C.派生类是基类定义的延续D.派生类是基类的组合(4)下列对派生类的描述中,错误的是()。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的缺省继承方式是privateD.派生类只含有基类的公有成员和保护成员(5)下列对继承的描述中,错误的是()。