派生类的定义

合集下载

C++ 基类和派生类

C++ 基类和派生类

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)保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

编程选择题题库

编程选择题题库

编程选择题题库1). c++语言中用于定义类的关键字是( )a.classb.structc.defaultd.sizeof正确答案:a2). 必须想要并使23.的输入为23.应用领域的语句就是( )a.cout<<23.;b.cout<c.cout<<23. -0.;d.cout<正确答案:c3). 以下选项中恰当的语句就是( )。

正确答案:d答案解析:在选项d中,字符指针s指向字符串常量book!。

故选项d恰当。

4). 在32位的计算机中,一个char型数据所占的内存长度的字节是( )a.4b.1c.2d.8恰当答案:b5). 静态成员函数没有( )。

a.返回值b.this指针c.指针参数d.返回类型恰当答案:b答案解析:this指针是系统隐含的用于指向当前对象的指针。

由于静态函数是同类中所有对象都共享的函数,在内存中只存在一份,不属于某个对象所有,所以静态函数没有this指针。

6). 关于tcsh函数,以下定义中恰当的就是( )。

a.纯虚函数是没有给出实现版本(即无函数体定义)的虚函数b.tcsh函数的声明总是以″=0″完结c.派生类必须实现基类的纯虚函数d.所含tcsh函数的类不可能将就是派生类正确答案:b答案解析:tcsh函数就是在声明虚函数时被″初始化″为o的虚函数。

tcsh函数没函数体,tcsh函数的促进作用就是在基类中为其派生类留存一个函数名称。

7). 下列链表中,其逻辑结构属于非线性结构的是( )a.二叉链表b.循环链表c.双向链表d.带链的栈恰当答案:a8). 数据库管理系统dbms中用来定义模式、内模式和外模式的语言为( )a.cb.basicc.ddld.dml恰当答案:c9). 下面对于友元函数描述正确的是a.友元函数的同时实现必须在类的内部定义b.友元函数是类的成员函数c.友元函数毁坏了类的PCB性和暗藏性d.友元函数不能访问类的私有成员恰当答案:c答案解析:友元函数的定义既可以在类内部进行,也可以在类外部进行。

派生类的定义和使用

派生类的定义和使用

派生类的定义和使用
派生类的定义和使用
派生类是通过从一个已有的类(被称为基类)派生而来的新类。

派生类也可称作“子类”,基类也可称作“父类”,它们之间存在着一种“从属”关系。

派生类可以保留基类的所有功能,并且可以在基类的基础上增加新的特性和功能,从而实现新的功能。

派生类通常具有两个特点:(1)它可以从基类继承成员变量;(2)它可以重新实现基类的方法,即重写基类的方法。

使用派生类的一般步骤如下:
1. 定义基类:首先定义一个基类,该类中包括必需的成员,如成员变量、构造函数和成员函数。

2. 定义派生类:定义派生类时,往往会使用基类中的成员变量和成员函数,它可以使用基类的构造函数,也可以定义自己的构造函数。

3. 使用派生类:派生类的成员变量和成员函数,可以像使用基类一样使用,也可以通过多态(即重写基类的方法)实现多态性。

派生类的一个重要作用是将复杂的问题细分为若干简单的子问题,从而提高程序的可维护性和可扩展性。

派生类也是典型的面向对象编程(OOP)的重要技术,它可以大大简化大型复杂的程序编写过程。

- 1 -。

派生类和基类

派生类和基类

(2) 基类成员对派生类的可见性:
公有成员和保护成员可见,而私有成员不可见。这里保护成员同于公有成员。
(3) 基类成员对派生类对象的可见性:
公有成员可见,其他成员不可见。
所以,在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。这里,一定要区分清楚派生类的对象和派生类中的成员函数对基类的访问是不同的。
可见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于一个。
派生类的三种继承方式
公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。
1. 公有继承(public)
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。
不可访问
保护继承 public protected
protected
private protected
不可访问
为了进一步理解三种不同的继承方式在其成员的可见性方面的区别,下面从三种不同角度进行讨论。
对于公有继承方式:
(1) 基类成员对其对象的可见性:
公有成员可见,其他不可见。这里保护成员同于私有成员。
派生类将其本身与基类区别开来的方法是添加数据成员和成员函数。因此,继承的机制将使得在创建新类时,只需说明新类与已有类的区别,从而大量原有的程序代码都可以复用,所以有人称类是“可复用的软件构件”
下面列出三种不同的继承方式的基类特性和派生类特性。
不同继承方式的基类和派生类特性
继承方式 基类特性 派生类特性
公有继承 public public

派生类

派生类

继承与派生类1 知识要点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.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。

基类和派生类

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

第5章 派生类

第5章 派生类

class b:public a { public: void set(int i ,int j) { y=i; x=j; //错误,不能继承私有 } }; class b:protected a { public: void set(int i) { x=i; //访问基类保护成员 };
例2:class a { protected: int x; } ;
1.抽象基类: 1.抽象基类:在基类中只有纯虚函数的声明,该函数 抽象基类 的定义在派生类中的类。抽象基类只能派生新类,不能定 义对象。 2.纯虚函数的声明 2.纯虚函数的声明
函数名(参数表)=0; virtual 类型 函数名(参数表)=0; 例:class a class b:public a { { public: public: int x; void s() vritual void s()=0; { }; x=1; void main() } }; { a bl;\\错,不能定义对象 } 例:5.11 用抽象基类计算矩型面积。
当某个类继承了它类的属性和功能时,则该类是他类的派生类。 当某个类继承了它类的属性和功能时,则该类是他类的派生类。
一.派生类的定义: 派生类的定义:
派生类名: class 派生类名:权限 基类名 { private: 私有成员列表 protected: 保护成员列表 public: 公有成员列表 } ; 例:class a { … }; class b:public a { … }; //b是a的公有派生
1.作用:编译时不在对象中为虚函数分配空间,只分配调用虚函数 的指针,在运行时动态连接。 2.定义: virtual 类型 { 函数体 } 例:class a { public: int x; vritual void s(); }; 例:5.4 阅读分析程序 vritual void a::s() { … } 函数名(参数表) 函数名(参数表)

第5章 派生类与继承

第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. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、模拟人的行走、听、说、写
2、为什么需要继承
3、派生类的定义
4、基类与派生类
5、三种继承方式
6、派生类的构造与析构函数
7、点、圆、圆柱体继承设计
8、从U盘到MP3继承设计
class 派生类名: 继承方式基类名1, 继承方式基类名2, …, 继承方式基类名n
{
派生类增加的成员声明;
};
class sing_star:public person
{
float salary; //薪水
public:
sing_star(); //无参构造函数
sing_star(char *n,char s,char *p,int w,int h,float s1); //有参构造函数void change_data(char *n,char s,char *p,int w,int h,float s1);//修改数据void playing(char *ps); //演唱歌曲
void print(); //输出歌星属性值
☞一个人一生中有许多重要日期和时刻☞上大学日期、入党日期
☞出生时间
class Date
{
protected:
int year
int month;
int day;
public:
Date() { year = 1900; month = day = 1; }
Date(int yy,int mm,int dd){init(yy,mm,dd);}; void init(int,int,int );
void print_ymd();
void print_mdy();
class Time
{
protected:
int hour;
int miniter;
int second;
public:
Time() { hour = miniter = second = 0; }
Time(int h,int m,int s){init(h,m,s);};
void init(int,int,int );
void print_time();
class person:public Date,public Time
{//注意包含了基类的出身日期和出身时间
char name[20];
char sex;
char pid[19];
int weight;
int high;
public:
person();
person(char *n,char s,char *p,int w,int h,int hr,int mr,int sd);
void change_data(char *n,char s,char *p,int w,int h,int hr,int mr,int sd);
void walking(int k);
void hearing(char *sentence);
void speek();
void writing();
void ShowMe();
person::person()
{
name=new char[strlen("XXXXXX")+1];
strcpy(name,"XXXXXX");
strcpy(pid,"XXXXXXXXXXXXXXXXXX");
sex='X';
weight=0;
high=0;
year=1900;
month=day=1;
hour=miniter=second=0;
}
person::person(char *n,char s,char *p,int w,int hh,int hr,int mr,int sd) {
change_data(n,s,p,w,hh,hr,mr,sd);
void person::change_data(char *n,char s,char *p,int w,int hh,int hr,int mr,int sd) {name=new char[strlen(n)];
strcpy(name,n);
strcpy(pid,p);
sex=s;
weight=w;
high=hh;
char temp[5];//通过身份证号码产生出身日期
strncpy(temp,p+6,4);
year=atoi(temp);
strncpy(temp,p+10,2);
temp[2]='\0';
month=atoi(temp);
strncpy(temp,p+12,2);
temp[2]='\0';
day=atoi(temp);
hour=hr;
miniter=mr;
int main()
{
//创建对象
person Jack("James Chen",'M',"610103************",160,180,23,34,35);
Jack.print(); //输出人的属性值
system("pause");
Jack.walking(10,4); //行走10步,1/4秒走一步
Jack.hearing("You are simple"); //听英文句子
Jack.speek(1006); //说出整数num的英文句子
cout<<endl;
Jack.writing(); //书写汉字“曲”
return 0;。

相关文档
最新文档