当前位置:文档之家› 派生类

派生类

继承与派生类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分析:一个派生类可以作为另一个派生类的基类。

无论是单继承还是多继承,派生类至少有一个基类。

派生类的成员除了它自己的成员外,还包含了它的基类成员。

派生类中继承的基类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的public,protected成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。

138例题2:派生类的对象对它的哪一类基类成员是可以访问的?()A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员答案:A分析:公有继承的基类的公有成员在派生类中保持公有访问权限,所以派生类对象可以访问它;公有继承的基类的保护成员在派生类中保持保护访问权限,所以派生类对象不可以访问它;基类的私有成员不能被派生到派生类中,所以派生类对象不可以访问它;保护继承的基类的公有成员在派生类中变成保护的访问权限,所以派生类对象不可以访问它。

例题3:关于多继承二义性的描述,()是错误的。

A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性答案:D分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问共同基类的成员时可能出现二义性。

消除二义性的方法是采用作用域运算符。

派生类和它的基类中出现同名函数时,不可能出现二义性。

例题4:多继承派生类构造函数构造对象时,()被最先调用。

A.派生类自己的构造函数B.虚基类的构造函数C.非虚基类的构造函数 D.派生类中子对象类的构造函数答案:B分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,派生类中子对象类的构造函数,派生类自己的构造函数。

例题5: C++类体系中,能被派生类继承的是()。

A.构造函数 B.虚函数 C.析构函数 D.友元函数答案:B分析:C++类体系中,构造函数、析构函数和友元函数是不能被派生类继承的.例题6:设有基类定义:class Cbase{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员( )A. 私有继承B.保护继承C. 公有继承D.私有、保护、公有均可答案:A139 分析:私有继承时,基类的protected成员在派生类中作为private成员。

(2)继承具有(),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。

A)规律性 B.传递性 C.重复性 D.多样性答案:B(3)下列对基类和派生类关系的描述中,错误的是()。

A.派生类是基类的具体化B.派生类是基类的子集C.派生类是基类定义的延续D.派生类是基类的组合答案:B(4)下列对派生类的描述中,错误的是()。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的缺省继承方式是privateD.派生类只含有基类的公有成员和保护成员答案:D(5)下列对继承的描述中,错误的是()。

A.析构函数不能被继承B.派生类也是基类的组合C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D(6)派生类的对象对它的基类成员中()是可以访问的。

A.公有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.私有继承的公有成员答案:A(8)下面叙述错误的是( A )。

A.基类的protected成员在派生类中仍然是protectedB.基类的protected成员在public派生类中仍然是protected的C.基类的protected成员在private派生类中是private的D. D. 基类的protected成员不能被派生类的对象访问答案:A(9)C++类体系中,不能被派生类继承的有()。

A.构造函数B.虚函数C.静态成员函数D.赋值操作函数答案:A(10)设置虚函数的声明中,正确的是()。

A.简化程序B.消除二义性C.提高运行效率D.减少目标代码答案:B(11)下列虚基类的声明中,正确的是( D )。

140A.class virtual B:public AB.virtual class B:public AC.class B:public A virtualD.class B: virtual public A答案:D(12) 以下关于静态成员变量的叙述不正确的是( D )A.静态成员变量为类的所有对象所公有B.静态成员变量可以在类内任何位置上声明C.静态成员变量的赋初值必须放在类外D.定义静态成员变量时必须赋初值(13) 定义静态成员函数的主要目的是( C )A.方便调用B.有利于数据隐藏C.处理类的静态成员变量D.便于继承例题7:C++将类继承分为(1) 和(2) 两种。

答案:(1)单继承(2)多继承分析:派生类可以只从一个基类中派生,也可以从多个基类中派生。

从一个基类中派生的继承方式称为单继承。

从多个基类中派生的继承方式称为多继承。

例题8:派生类可以定义其_______________中不具备的数据和操作。

答案:基类分析:派生类是从基类派生的,派生类包含了它所有基类的除构造函数、析构函数之外的所有成员,同时还拥有它自己的新成员。

例题10:在继承机制下,当对象消亡时,编译系统先执行(1) 的析构函数,然后才执行(2) 的析构函数,最后执行(3) 的析构函数。

答案:(1)派生类(2)派生类中子对象类(3)基类分析:派生类的析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。

简答题:1. 派生类构造函数执行的次序是怎样的?答:派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类是指定的各基类顺序),再执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。

1412. 假定给定下列的程序代码,请写出B类和C类的成员及它们的访问权限。

class A{ int x;protected:int y;public:A();~A();friend void cal();void display();};class B:private A{ int z;public:B();void fun();};class c:public B{ int t;public:c();~c();};结果:1423.设有以下类的定义:class A class B: public A class C: protected 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中具有的成员。

答: 私有成员:c1保护成员:c2、b2、b3、A2、A3公有成员:c35.编程序(1)一个基类有姓名、性别、年龄,再由基类派生出教师类和学生类,教师类增加工号、职称和工资,学生类增加学号、班级、专业和入学成绩,由构造函数进行初始化。

#include<iostream.h>#include<string.h>#include<iomanip.h>class base //定义一个基类{ char name[20]; //姓名143char sex[3]; //性别int age; //年龄public:base(char *str1,char *str2,int i){ strcpy(name,str1);strcpy(sex,str2);age=i;}};class teacher:public base //基类派生出教师类{ int sno; //工号char zc[20]; //职称double wages; //工资public:teacher (char *str1,char *str2,int i,int j,char *str3,double k):base(str1,str2,i){ sno=j;strcpy(zc,str3);wages=k;}};class student :public base //基类派生出学生类{ int sno; //学号char bj[10]; //班级char zy[10]; //专业double score; //入学成绩public:student (char *str1,char *str2,int i,int j,char *str3, char *str4,double k,):base(str1,str2,i){ sno=j;strcpy(bj,str3);strcpy(zy,str4);score=k;}};2 定义一个人员类person,包括成员变量:编号、姓名、性别和用于输入输出的成员函数。

相关主题