当前位置:文档之家› 《C++程序设计教程》第二版 第12章 继承和派生(例子)

《C++程序设计教程》第二版 第12章 继承和派生(例子)

《C++程序设计教程》第二版 第12章 继承和派生(例子)
《C++程序设计教程》第二版 第12章 继承和派生(例子)

例12.1先定义“点”类Point,

再由“点”类派生出“圆”类Circle。

#include

#define PI 3.14

class Point // 定义“点”类

{

int x, y;

public:

Point(int a=0, int b=0)

{ x=a; y=b; }

void ShowPoint( )

{ cout<<"Point:("<

int Getx( )

{ return x; }

int Gety( )

{ return y; }

void Setxy(int a, int b)

{ x=a; y=b; }

};

class Circle: public Point// 定义“圆”类,公有继承{

int r;// “圆”的半径

public:

Circle(int x, int y, int ra) : Point(x, y)// B

{ r = ra; }

void Setr(int ra)

{ r = ra; }

double Area( ) //求圆的面积

{ return PI*r*r; }

void Move(int x_offset, int y_offset) //将圆心坐标平移{

int x1=Getx( ); //存取基类的私有成员

int y1=Gety( ); // D

x1 += x_offset; y1 += y_offset;

Setxy(x1, y1); // E

}

void ShowCircle( )

{

ShowPoint( );// F

cout<<" Radius: "<

cout<<"Area: "<

}

};

void main( )

{

Circle c(1, 1, 1);

c.ShowCircle( );

c.Move(1, 2);

c.ShowCircle( );

c.Setxy(4, 5); //重新置圆心坐标

c.Setr(2); //重新置半径值

c.ShowCircle( );

}

回ppt讲稿

例12.3(改进版)基类构造函数和析构函数的调用顺序#include

class Base

{

protected:

int data;

public:

Base(int a=0)

{

data = a;

cout<<"Base Constructor\n";

~Base( )

{ cout<<"Base Destructor\n"; }

};

class Derived : public Base//A {

int d;

public:

Derived(int x, int y) : Base(x) //B

{ d=y; cout<<"Derived Constructor\n"; }

~Derived( ) { cout<<"Derived Destructor\n"; }

void Show( )

{ cout<

};

void main( )

{

Derived obj(1, 2);

obj.Show( );

}

程序的运行结果是:

Base Constructor

Derived Constructor

Derived Destructor

Base Destructor

返回ppt讲稿

例12.4(改进版)对象成员构造函数和析构函数的调用顺序

#include

class Base1

{

protected:

int data;

public:

Base1(int a=8)

{

data = a;

cout<

}

~Base1( ) { cout<

class Base2

{

protected:

int data;

Base2(int a=9)

{

data = a;

cout<

}

~Base2( ){ cout<

class Derived:public Base1

{

int d;

Base2 b1, b2;

public:

Derived(int x, int y) : Base1(x), b1(x+y), b2(x-y)

{ d=y; cout<<"Derived Constructor\n"; }

~Derived( ) { cout<<"Derived Destructor\n"; } void Show( ) { cout<

void main( )

{

Derived obj(1, 2);

obj.Show( );

}

程序的运行结果是:

1, Base1 Constructor

-1, Base2 Constructor //构造对象成员b2时的输出Derived Constructor

1, 2

Derived Destructor

-1, Base2 Destructor //析构对象成员b2时的输出3, Base2 Destructor //析构对象成员b1时的输出1, Base1 Destructor

返回ppt讲稿

例12.8 支配规则示例

#include

class A

{

protected:

int x;

public:

void Set(int a)

{ x=a; }

void Show( )

{ cout << "x=" << x << '\n' ; }

};

class B : public A

{

protected:

int x;

public:

void SetAx(int a)

{ A::x = a; } //访问的是基类A的x void SetBx(int a)

{ x = a; } //访问的是派生类B的x void Show( )

{ cout<<"x="<< x <

};

void main( )

{

B b;

b.SetAx(1);

b.SetBx(2);

b.A::Show( ); //访问的是基类A的Show( ) b.Show( ); //访问的是派生类B的Show( ) }

返回ppt讲稿

例12.12访问对象成员的成员

#include

class Point

{

int x, y;

public:

Point(int a=0, int b=0) { x=a; y=b;}

void Setx(int a){x=a;}

void Sety(int a){y=a;}

int Getx( ){ return x;}

int Gety( ){ return y;}

void Show( )

{ cout<<"point("<

};

class Line

{

Point p1, p2;//对象成员

public:

Line(int x1, int y1, int x2, int y2): p1(x1, y1), p2(x2, y2)

//调用对象成员构造函数{ }

double Length( )

{

int x1, y1, x2, y2;

//访问对象成员p1的成员

x1=p1.Getx( ); y1=p1.Gety( );

x2=p2.Getx( ); y2=p2.Gety( );

return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

}

void Show( )

{

p1.Show( );//访问对象成员p1的成员

p2.Show( ); //访问对象成员p2的成员

cout<<"Length="<

}

};

void main( )

{

Line line(0, 0, 1, 1);

line.Show( );

}

本程序的运行结果是:

point(0, 0)

point(1, 1)

Length=1.41421

注意在本程序中,Point类和Line类不是继承关系,只是Point类的两个对象,是Line类的对象成员,访问对象成员的成员,与访问一般对象的成员遵循同样的规则。

例12.13 访问基类成员

#include

#include

class Point

{

protected:

//定义x、y为保护成员,以使在公有派生类中可直接访问它们int x, y;

public:

Point(int a=0, int b=0) { x=a; y=b;}

void Setx(int a){x=a;}

void Sety(int a){y=a;}

int Getx( ){ return x; }

int Gety( ){ return y; }

void Show( )

{ c out<<"point("<

};

class Line : public Point //公有继承

{

protected :

int x1, y1;

Line(int a, int b, int c, int d) : Point(a, b)

//调用基类构造函数

{ x1=c; y1=d; }

double Length( )

{ return sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)); }

// A 直接访问基类保护成员x、y void Show( )

{

Point::Show( ); //访问基类成员函数Show( )

cout<<"point("<

cout<<"Length="<

}

};

void main( )

{

Line line(0, 0, 1, 1);

line.Show( );

}

返回ppt讲稿

例12.14 赋值兼容规则

#include

class Point

protected:

int x, y; // 保护成员

public:

Point(int a=0, int b=0) { x=a; y=b;}

void Show( )

{ cout<<"point("<

class Line : public Point // 公有继承{

protected:

int x1, y1;

public:

Line(int a, int b, int c, int d): Point(a, b) { x1=c; y1=d; }

};

void main( )

{

Line line(2, 2, 6, 6);

Point p;

p = line; // A

p.Show( );

}

程序运行结果是:Point(2, 2)

第3章 继承和派生习题

《面向对象程序设计》习题 班级:学号:姓名:名单序号:成绩: 第3章继承与派生 一、选择题(共28分,每题1分) 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++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。 A.复用 B.继承 C.封装 D.引用 8.继承具有(),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。 A.规律性 B.传递性 C.重复性 D.多样性

C++语言程序设计实验答案_继承与派生教学提纲

C++语言程序设计实验答案_继承与派生

实验07 继承与派生(4学时) (第7章继承与派生) 一、实验目的 二、实验任务 7_1 声明一个基类Animal。 有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。 7_2 声明一个基类BaseClass。 有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。 7_3 声明一个车(vehicle)基类。 具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。

7_4 以实验6中的People(人员)类为基类。 派生出student(学生)类,添加属性:班号char classNo[7]; 派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。 从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser; 从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。重载相应的成员函数,测试这些类。 类之间的关系如图7-1所示。 图7-1 类图

C 第八章继承与派生习题习题解答

第八章继承与多态习题 一.基本概念与基础知识自测题 8.1填空题 8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。(3)类 的对象可作为(4)类的对象处理,反过来不行,因为(5)。如果强制转换则要注意(6)。 答案:(1)基类 (2)派生类 (3)派生类 (4)基类 (5)派生类有一些新成员 (6)只能派生类强制转换为基类 8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员, protected成员成为派生类的(2)成员,对private成员是(3)。公有派生可以使其类的(4),所以公有派生是主流。 答案:(1)public成员 (2)protected成员 (3)不可访问 (4)接口不变 8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为 (2)。继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。 答案:(1)单继承 (2)多重继承 (3)层次 (4)单继承 8.1.6 C++中多态性包括两种多态性:(1)和(2)。前者是通过(3)实现的, 而后者是通过(4)和(5)来实现的。 答案:(1)编译时的 (2)运行时的 (3)函数和运算符的重载 (4)类继承关系 (5)虚函数 8.2简答题(以下习题题号可能和教材不一致!) 8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。派生类构造函数各部分的执行次序是: 1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。 2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。 3.派生类的构造函数体中的操作。 8.2.2什么叫派生类的同名覆盖(override)?

C++继承与派生类习题

第九章继承与派生类 9.2 典型例题分析与解答 例题1:下列对派生类的描述中,()是错误的。 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; }; 用派生类中子对象类的析构函数,最后调用基类的析构函数。 例题11:设有以下类的定义: 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)

Java 教案-第11章 继承和多态

第11章继承和多态 11.1介绍(Introduction) 面向对象编程允许从已有的类派生出新类,这叫继承(Inheritance)。继承是软件代码重用的一种机制,是一种在面向对象编程中非常重要的,而且强大的特性。假设已经定义了一个圆形,矩形和三角形的模型类,这些类有许多相同的特征,如何设计才能避免冗余,而且还能使系统易于理解和维护?答案就是使用继承。 11.2超类和子类 不同的类可能包含一些相同的,公共的特性和行为,把这些相同的东西组合在一起形成一个新的公共类来被其他类共享。继承就是定义一个一般类,然后扩展这个一般类形成更多的特殊类。这些特殊类继承了一般类的某些属性和操作。 这些类的对象我们可以称为几何对象,那么就创建一个称为几何类的一般类,这个一般类包含几何元素中的一些公共的属性和操作,如可以填充元素,修改线条的颜色,或撤销填充等。因此一般类GeometricObject可以作为所有几何对象的一般类模型。如图一般类的UML图,以及特殊类之间的关系图。 在Java术语中,一个类C1是从C2扩展来的,那么C1类称为子类,C2类称为父类或超类。子类继承父类可访问的数据和方法,同时可以扩展出自己的新的数据和方法如上图所示。代码如下。

思考一下,如下定义的构造方法是否正确?为什么? 答案是否定的,原因就是子类不能访问父类的私有的数据,但可以通过调用父类的get或set方法来访问它。

关于继承的几点注意: 1.子类不是超类的一个子集,实际上子类包含父类,并对其进行了扩展,内容比父类更丰富。 2.父类中私有的数据不能被它之外的任意类访问。因此,它们不能在子类中被直接使用。但是,如果在父类中定义了setter或getter,可以通过使用它们来访问这些数据。 3.并不是所有的is-a的关系都是继承关系,例如,一个方形是一个矩形,但却不能使用方向矩形来扩展方向,因为没有什么可扩展的。但却可以从几何类中进行扩展定义方形类。因为新的子类要比父类包含更多的详细信息。 4.继承被用来模型化is-a的关系。不要盲目的为了重用方法而扩展类。例如,没必要把一个树类扩展为人类,尽管二者具有很多相同的属性,比如高度和重量。子类和父类之间必须存在is-a的关系。 5.很多其他的编程如c++允许一个子类可以从几个父类扩展和继承,称多重继承,但Java不允许多重继承,即严格的单继承。即一个类的声明中只能有一个关键字extends,而且后面只有一个类名。如果想要拥有若干个类的特性,可以实现接口(在14章讲授)。 11.3supper关键字 子类继承了父类可访问的数据和方法,它是否继承构造方法呢?父类的构造方法可以在子类中被调用吗?在前面一章中,介绍过一个关键字this,表示对象自己。Super关键字则指它的父类,有2种方式被使用。 1.调用父类构造方法。 2.调用父类的其他方法 11.3.1 调用父类构造方法 调用父类的构造方法的格式如下: 其中super()调用父类无参数的构造方法,super(argument)调用父类和参数argument匹配的构造方法。但需注意的是,不管是使用哪条语句,调用父类的构造方法语句必须放在子类定义的构造方法之前,并且只能显示的调用父类的构造方法。如下语句是正确的。

继承与派生类

继承与派生类 知识要点 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.派生类和它的基类中出现同名函数时,将可能出现二义性

第七章派生与继承2

第七章派生与继承2 /*7.4多继承与虚基类 7.4.1多继承中的二义性问题 解决方式 1<对象名>.<基类名>::<成员名> //数据成员 <对象名>.<基类名>::<成员名>(<参数名>) //成员函数 */ /*#include using namespace std; class Base1 { public: int date; void fun(){cout<<"Member of Base1"<<";base1="< class animal {public:int age,weight;}; class dog:public animal {private:char color[10]; public: int SetAge(int n) {age=n;return n;} int SetWeight (int m)

继承与派生练习题

习题八 第八章继承与派生 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. 指出下列对定义重载函数的要求中,哪些是错误的提法。 A.要求参数的个数不同。 B.要求参数中至少有一个类型不同。 C.不要求函数的返回值不同。 D. 要求参数的个数相同时,参数类型不同。 8. 下面关于友元的描述中,错误的是()。 A.友元函数可以访问该类的私有数据成员 B.一个类的友元类中的成员函数都是这个类的友元函数 C.友元可以提高程序的运行效率 D.类与类之间的友元关系可以继承 9. 下述静态成员的特性中,()是错误的。 A.静态成员函数不能利用this指针 B.静态数据成员要在类体外进行初始化

第7章 继承性和派生类

第7章继承性和派生类 本章内容:基类和派生类、单继承、多继承、虚基类。 类 面向对象系统三要素对象 继承 封装性基础面向对象系统三特征继承性关键 多态性补充 继承是面向对象程序设计中软件重用的关键技术。继承机制使用已经定义的类作为基础建立新的类定义,新的类是原有类的数据﹑操作和新类所增加的数据﹑操作的组合。 新的类把原有类作为基类引用,而不需要修改原有类的定义。新定义的类作为派生类引用。这种可扩充﹑可重用技术大大降低了大型软件的开发难度和维护费用。 7.1 基类和派生类

我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。 在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。 单继承 多继承 7.1.1派生类的定义格式 单继承的定义格式: class 派生类名:继承方式 基类名 { 派生类新定义成员 }; public 表示公有继承 继承方式 private 表示私有继承 protected 表示保护继承

继承方式规定了如何访问从基类继承的成员。继承方式却省,隐含私有继承。 多继承的定义格式如下: class 派生类名:继承方式1 基类名1, 继承方式2 基类名2,… { 派生类新定义成员 }; 7.1.2 派生类的三种继承方式 1.公有继承(public) 公有成员是类的接口,在类中和类外可见。 特点:基类的公有和保护成员的访问属性在派生类中不变、而基类的私有成员不可访问。 基类成员 派生类新定义成员成员

派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。 2.私有继承(private) 私有成员只能在类中可见,不能再类外或派生类中使用。 特点:基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而基类的私有成员在派生类中不可访问。 基类成员 派生类 新定义成员成员 派生类的成员函数可以访问基类中的公有成员和保护成员。而无法再往下继承。 3.保护继承(protected) 保护成员在类中和它的派生类中可见。

继承与派生

第7章——继承与派生 一、选择题 1.在c++中,类之间的继承关系具有( )。 (a) 自反性 (b) 对称性 (c) 传递性 (d) 反对称性 2.下列关于类的继承描述中,( )是正确的。 (a) 派生类公有继承基类时,可以访问基类的所有数据成员,调用所有成员函数。 (b) 派生类也是基类,所以它们是等价的。 (c) 派生类对象不会建立基类的私有数据成员,所以不能访问基类的私有数据成员。 (d) 一个基类可以有多个派生类,一个派生类可以有多个基类。 3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( )。 (a) public成员(b) private成员(c) protected成员(d) 友员 4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( )。 (a) public成员(b) private成员(c) protected成员(d) 友员 5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( )。 (a) public成员(b) private成员(c) protected成员(d)友员 6.不论派生类以何种方式继承基类,都不能直接使用基类的()。 (a) public 成员(b) private成员 (c) protected成员(d) 所有成员 7.下面描述中,错误的是( )。 (a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问。 (b) 在基类定义的protected成员在私有继承的派生类中可见。 (c) 在基类定义的公有静态成员在私有继承的派生类中可见。 (d) 访问声明可以在公有继承派生类中把基类的public成员声明为private成员。 8.在c++中,可以被派生类继承的函数是( = )。 (a) 成员函数(b)构造函数(c) 析构函数(d)友员函数 9.在创建派生类对象时,构造函数的执行顺序是( = )。 (a) 对象成员构造函数—基类构造函数—派生类本身的构造函数 (b) 派生类本身的构造函数—基类构造函数—对象成员构造函数 (c) 基类构造函数—派生类本身的构造函数—对象成员构造函数 (d) 基类构造函数—对象成员构造函数—派生类本身的构造函数 10.当不同的类具有相同的间接基类时,( c )。 (a) 各派生类无法按继承路线产生自己的基类版本 (b) 为了建立惟一的间接基类版本,应该声明间接基类为虚基类 (c) 为了建立惟一的间接基类版本,应该声明派生类虚继承基类 (d) 一旦声明虚继承,基类的性质就改变了,不能再定义新的派生类 二、阅读下列程序,写出执行结果 1. #include using namespace std; class Base { public : void get( int i,int j,int k,int l ) { a = i; b = j; x = k; y = l;

实验三 派生类与继承

实验三派生类与继承 一、实验目的 1、学习类的继承,能够定义和使用类的继承关系。 2、学习派生类的声明与定义方法。 3、掌握类的定义和对象的声明。 4、熟悉公有派生和私有派生的访问特性。 5、掌握派生类构造函数和析构函数的执行顺序。 6、掌握利用访问声明调整基类成员在派生类中的访问属性。 二、试验内容 1、下面的程序可以输出ASCII字符与所对应的数字的对照表。修改下列程序,使其可以输出字母a到z(或任意两个字符间)与所对应的数字的对照表。class table { public: table(int p) { i=p; } void ascii(void); protected: int i; }; void table::ascii(void) { int k=1; for (;i<127;i++) { cout<

{ c=m; } void print(void); protected: char *c; }; void der_table::print(void) { cout< class table { public: table(int p) { i=p; } void ascii(void); protected: int i; }; void table::ascii(void) { int k=1; for (;i<123;i++) { cout<

C (练习)第8章,继承与派生

一,单选题 1.下列描述中错误的是( )。 A 继承分为多重继承和单继承 B 对象间通信靠传递消息实现 C 在外面看不到对象的内部特征是基于对象的"模块独立性好"这个特征 D 类是具有共同属性、共同方法的对象的集合 参考答案 C 2. 设有以下定义: #include class A1 { public: void show1() { cout<<"class A1"<

3. 下列描述中哪个是正确的__________。?????? A 私有派生的子类无法访问父类的成员 B 类A的私有派生子类的派生类C无法初始化其祖先类A对象的属性,因为类A的成员对类C是不可访问的 C 私有派生类不能作为基类派生子类 D 私有派生类的所有子孙类将无法继续继承该类的成员 参考答案 B 4. 下面有关派生类的说法中,错误的是( )。 A 一个派生类可以作为另一个派生类的基类 B 一个派生类可以有多个基类 C 派生类构造函数可以将初始化参数值传递给基类的构造函数和对象成员的构造函数 D 具有继承关系时,基类成员在派生类中的访问权限不变 参考答案 D 5. 设置虚基类的目的是( )。 A 简化程序 B 消除二义性 C 提高运行效率 D 减少目标代码 参考答案 B 6. 有以下定义的子类: class A:public B { ... }; 则下面描述中正确的是 A A类中的成员函数可以访问B类中的private 数据成员 B A类中的成员函数只能访问B类中的protected数据成员。 C A类中的成员函数可以访问B类中的public数据成员。 D A类中的成员函数只能访问B类中的public数据成员 参考答案 C 7. 有如下类定义: class A { public: int x; };

实验四 继承与派生(学生)

实验四:继承与派生(2) 一、实验目的和要求 (1)理解单继承与多继承,掌握多继承派生类的声明方式。 (2)掌握多继承派生类构造函数的定义的一般形式。 (3)掌握多继承构造函数与析构函数的执行顺序。 (4)掌握含有对象成员的派生类构构造函数的特点。 (5)理解类的继承可能发生的“二义性”问题(同名成员的访问) 二、知识点回顾 多继承构造函数定义的一般形式如下: 派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),…,基类名n(参数表n) { // 派生类新增成员的初始化语句 } class B: public A class D:public A, public B, public C { { B(int i,int j):A( i) { ….. D(int i,int j,int k, int l):A( i),B(j ),C( k),ob(l ) } { ……. } }; }; ……. D obj(1,2,3,4); 多重继承构造函数的执行顺序与单继承下的构造函数执行顺序相同: (1)先执行基类的构造函数。 (2)再执行对象成员的构造函数。 (3)最后执行派生类的构造函数体。 说明:处于同一层的各个基类的构造函数的执行顺序, 取决于声明派生类时所指定的各个基类的顺序, 与派生类构造函数中所定义的成员初始化列表中的顺序并没有关系. 说明:派生类构造函数后如未列出基类构造函数的调用,默认调用的是无参或带默认参数的构造函数。 三、实验内容 1. P191题4.15输入下列程序,分析程序运行结果........ 。 理解多重继承(画出类的层次结构图),注意派生类构造函数的定义格式,注意构造函

C 课后习题答案第七章

C++作业答案 第7章继承 7.1 选择题 1.在c++中,类与类之间的继承关系具有( c )。 (a) 自反性 (b) 对称性 (c) 传递性 (d) 反对称性 2.下列关于类的继承描述中,( a,b )是错误的。 (a) 派生类可以访问基类的所有数据成员,调用基类的所有成员函数 (b) 派生类也是基类,所以基类具有派生类的全部属性和方法 (c) 继承描述类的层次关系,派生类可以具有与基类相同的属性和方法 (d) 一个基类可以有多个派生类,一个派生类可以有多个基类 3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( a )。 (a) public 成员 (b)private成员 (c) protected成员 (d)友员 4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( b )。 (a) public 成员 (b)private成员 (c) protected成员 (d)友员 5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( c )。 (a) public 成员 (b)private成员 (c) protected成员 (d)友员 6.不论派生类以何种方式继承基类,都不能使用基类的( b )。 (a) public 成员 (b)private成员 (c) protected成员 (d)public 成员和protected成员 7.下面描述中,错误的是( b, c )。 (a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问 (b) 在基类定义的public和protected成员在私有继承的派生类中可见,在类外可以被访问 (c) 在基类定义的public和protected成员在保护继承的派生类中不可见 (d) 在派生类中不可见的成员要变成可访问的需进行访问声明 8.在c++中,不能被派生类继承的函数是( b,c )。 (a) 成员函数 (b)构造函数 (c) 析构函数 (d)静态成员函数

实验二 类的继承与派生

实验二类的继承与派生 一、实验目的 1. 掌握类的声明和使用。 2. 掌握对象的声明和使用。 3. 掌握具有不同访问属性的成员的访问方式。 4. 观察构造函数和析构函数的执行过程。 5. 学习声明和使用类的继承关系,声明派生类; 6. 熟悉不同继承方式下对基类成员的访问控制; 二.实验内容 1. 设计一个用于人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、 id(身份证号)等等。具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号charid[20]。其中“出生日期”声明为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、组合。在测试程序中声明people 类的对象数组,录入数据并显示。 2. 从people(人员)类派生出student(学生)类,添加属性:班号char classNO[7];从people 类派生出teacher(教师)类,添加属性:职务char pship[11]、部门char departt[21]。从student 类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate 类和teacher 类派生出TA(助教博士生)类,重载相应的成员函数,测试这些类。 三 . 实验步骤 1.程序代码 第一题 #include #include using namespace std; class Date //日期类 { private: int year; int month; int day; public: Date(){} //默认构造 Date(int y,int m,int d) //带参构造 { year=y; month=m; day=d; }

继承与派生习题

1.概念填空题 1.1在C++中,三种派生方式的说明符号为、、不加说明,则默认的派生方式为。 1.2当公有派生时,基类的公有成员成为派生类的;保护成员成为派生类的;私有成员成为派生类的。当保护派生时,基类的公有成员成为派生类的;保护成员成为派生类的;私有成员成为派生类的。 1.3 派生类的构造函数一般有3项工作要完成:首先,其次,最后。 1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现。在派生类中采用或来消除该问题。 2.选择题 2.1下面对派生类的描述中,错误的是()。 A.一个派生类可以作为另外一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类的成员 D.派生类中继承的基类成员的访问权限到派生类中保持不变 2.2下列对友元关系叙述正确的是()。 A.不能继承 B.是类与类的关系 C.是一个类的成员函数与另一个类的关系 D.提高程序的运行效率 2.3当保护继承时,基类的()在派生类中成为保护成员,不能通过派生类的对象来直接访问。 A.任何成员B.公有成员和保护成员 C.公有成员和私有成员D.私有成员 2.4在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是()。 A.派生类的对象可以赋给基类的对象 B.派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 2.5有如下类定义: class MyBASE{ int k; public: void set(int n) {k=n;} int get( ) const {return k;} }; class MyDERIVED: protected MyBASE{ protected; int j; public: void set(int m,int n){MyBASE::set(m);j=n;} int get( ) const{return MyBASE::get( )+j;}

第十一章 继承与派生 复习题

第十一章继承与派生复习题 1. 下面叙述错误的是( ) A. 派生类可以使用private派生 B. 对基类成员的访问必须是无二义性的 C. 基类成员的访问能力在派生类中维持不变 D. 赋值兼容规则也适用于多继承的组合 2.派生类的对象对它的基类成员进行访问,可以采用对象.或者对象指针-〉的 方式访问的是( ) A. 公有继承的公有成员 B. 公有继承的私有成员 C. 公有继承的保护成员 D. 私有继承的公有成员 3. 当私有继承时,在派生类中成为私有成员,不能通过派生类的对象来直接访 问该成员是基类的() A. 任何成员 B.公有成员和保护成员 C. 保护成员和私有成员 D.私有成员 4. C++的类有两种用法:一种是类的实例化,即生成类的对象,并参与系统的运 行;另一种是通过() A. 复用派生出新的类 B. 继承派生出新的类 C. 封装派生出新的类 D. 引用派生出新的类 5.当保护继承时,在派生类中成为保护成员,不能通过派生类的对象来直接访 问的成员是基类的() A.任何成员 B.公有成员和保护成员 C.保护成员和私有成员 D.私有成员 6.类B的数据成员中“有一个”A类的对象,这种类之间的关系是( ) A.继承关系 B.间接关系 C.组合关系 D.直接关系 7. 派生类的构造函数的成员初始化列表中,不能包含( ) A. 基类的构造函数 B. 派生类中子对象的初始化 C. 基类中子对象的初始化 D. 派生类中一般数据成员的初始化 8 公有成员提供了类对外部的接口,私有成员是类的内部实现,而不允许外界 访问,但允许派生类访问的成员是( ) A. 公有成员 B. 私有成员 C. 私有成员 D. 保护成员 9. 当公有继承时,在派生类中成为保护成员,不能通过派生类的对象来直接访

相关主题
文本预览
相关文档 最新文档