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

合集下载

C++程序设计与应用基础第四章继承与派生习题答案

C++程序设计与应用基础第四章继承与派生习题答案

第四章继承与派生1、填空题1)在派生类中使用基类的成员,可以显示地使用___成员名限定符__来使用基类成员。

2)垂直访问时,保护成员的访问控制权限与____公有_____成员相同3)指向基类的对象的指针变量也可以指向___派生类____的对象。

4)若类Y是类X的私有派生类,类Z是类Y的派生类,则类Z__不能___访问类X的保护成员与公有成员。

5)在划线处填上适当的语句,完成下列程序。

#include <math.h>class Point{public:point(double a,double b,double c){___X=a;Y=b;Z=c;___}double Getx(){return X;}double Gety(){return Y;}double Getz(){return Z;}private:______double X;______protected:_____double Y,Z;_____};class Line :_____public______Point{public:Line(double a ,double b,double c,double d)_____:point(a,b,c)__{_ k=d;_ }void show(){cout<<Getx()<<endl;cout<<Gety()<<““<<.<<<endl;cout<<Getz()<<““<<Z<<endl;cout<<K<<endl;}private:double k;};void main(){Line obj(1.2,3.4,5.6,7.8);obj.show();}6)设置虚基类的目的是__解决二义性问题___,可通过___关键字virtual__标识虚基类。

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

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 类图三、实验步骤1.(编程)声明基类Animal,成员变量age声明为私有的。

构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:(注:在桌面创建一个文本文件,将输出框的内容复制到文本文件中,再复制到Word文件中,不会出现汉字的乱码)把age改为公有变量后重新编译就可以了。

c继承与派生习题答案

c继承与派生习题答案
1.3派生类的构造函数一般殳有3项工作要完成:首先_基类初始化一,其次—成员 对象初始化,最后_执行派生类构造函数体_。
1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现—二
义性一。在派生类中采用_虚基类_或_作用域分辨符一来消除该问题。
3.选择题
3.1下面对派生类的描述中,错误的是(D)。
};
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;}
};
则类MyDERIVED中保护成员个数是(B)。
概念填空题
1.1在C++中,三种派生方式的说明符号为_public_、_private.、protected不加 说明,则默认的派生方式为private.。
1.2当公有派生时,基类的公有成员成为派生类的公有成员保护成员成为派
生类的_保护成员;私有成员成为派生类的—不能直接访问成员_。当保护派生时, 基类的公有成员成为派生类的—保护成员;保护成员成为派生类的—保护成员 私有成员成为派生类的—不能直接访问成员_。
A.—个派生类可以作为另外一个派生类的基类
B.派生类至少有一个基类
C.派生类的成员除了它自己的成员外,还包含了它的基类的成员
D.派生类中继承的基类成员的访问权限到派生类中保持不变
3.2下列对友元关系叙述正确的是(A)。
A.不能继承
B.是类与类的关系
C.是一个类的成员函数与另一个类的关系

面向对象的程序设计c++多继承 (附答案)

面向对象的程序设计c++多继承 (附答案)
{
public:
int z;
C(int a,int b,int d,int e,int m):B1(a,b),B2(d,e)
{
(3)
}
void print()
{
Cout<<”x=”<<x<<endl;
Cout<<”y1=”<<y1<<”, y2=”<<y2<<endl;
cout<<"z="<<z<<endl;
A(int a=0)
{x=a;}
};
class B1: public A
{
public:
int y1;
B1(int a=0,int b=0):A(b)
{
(1)
}
};
class B2: public A
{
public:
int y2;
B2(int a=0,int b=0):A(b)
{
(2)
}
};
class C:public B1,public B2
void display()
{
cout<<x<<','<<y<<endl;}
void move()
{offset(3,5);
}
void show()
{
A::display();
}
private:
int x,y;
};
void main()
{
A e(1,2);
B d(3,4,5,6);
e.display();//(3)

实验5继承实验参考答案

实验5继承实验参考答案

实验5 继承与派生参考答案2 ) 分析下面的程序,指出程序运行的结果:#include<iostream.h>class CBase1{int x ;public:CBase1( ){x=0 ; cout<<"调用构造函数CBase1( )!\n";}CBase1( int a){x=1;cout<<"调用构造函数CBase1( int )!\n";}~CBase1( ){cout<<"调用析构函数~CBase1( )!\n";}};class CBase2{int y;public:CBase2( ){y=0 ;cout<<"调用构造函数CBase2( )!\n";}CBase2(int a){y=a ;cout<<"调用构造函数CBase2(int )!\n";}~CBase2(){cout<<"调用析造函数~CBase2( )!\n";}};class A{ int x;public:A() {x=0 ; cout<<"调用构造函数A( )!\n";}A(int a){x=a;cout<<"调用构造函数A(int )!\n";}~A(){cout<<"调用析构函数~A()!\n";}};class CDerived:public CBase1, virtual public CBase2{A a;public:CDerived(){cout<<"调用构造函数CDerived( )!\n";}CDerived(int x,int y ,int z):a(x),CBase1(y),CBase2(z){cout<<"调用构造函数CDerived(int,int )!\n";}~CDerived(){cout<<"调用析造函数~CDerived( )!\n";}};void main(){CDerived*x=new CDerived; CDerived y(2,3,4);delete x;cout<<"main()函数结束!\n"; }程序分析:a)类分析:本程序有三个类,其中类CDerived公有继承类CBase1和虚基类CBase2,类CDerived使用类A。

程序设计教程(机械工业出版社)课后习题答案 第8章 继承――派生类

程序设计教程(机械工业出版社)课后习题答案  第8章 继承――派生类

第8章继承――派生类1、在C++中,protected类成员访问控制有什么作用?答:C++中引进protected成员保护控制,缓解了数据封装与继承的矛盾。

在基类中声明为protected的成员可以被派生类使用,但不能被基类的实例用户使用,这样能够对修改基类的内部实现所造成的影响范围(只影响子类)进行控制。

protected成员保护控制的引进使得类有两种接口:与实例用户的接口和与派生类用户的接口。

2、在C++中,三种继承方式各有什么作用?答:类的继承方式决定了派生类的对象和派生类的派生类对基类成员的访问限制。

public继承方式使得基类的public成员可以被派生类的对象访问,它可以实现类之间的子类型关系;protected继承使得基类的public成员不能被派生类的对象访问,但可以被派生类的派生类访问;private继承使得基类的public成员既不能被派生类的对象访问,也不能被派生类的派生类访问。

protected和private继承主要用于实现上的继承,即纯粹为了代码复用。

3、在多继承中,什么情况下会出现二义性?怎样消除二义性?答:在多继承中会出现两个问题:名冲突和重复继承。

在多继承中,当多个基类中包含同名的成员时,它们在派生类中就会出现名冲突问题;在多继承中,如果直接基类有公共的基类,就会出现重复继承,这样,公共基类中的数据成员在多继承的派生类中就有多个拷贝。

在C++中,解决名冲突的方法是用基类名受限;解决重复继承问题的手段是采用虚基类。

4、写出下面程序的运行结果:#include <iostream>using namespace std;class A{ int m;public:A() { cout << "in A's default constructor\n"; }A(const A&) { cout << "in A's copy constructor\n"; }~A() { cout << "in A's destructor\n"; }};class B{ int x,y;public:B() { cout << "in B's default constructor\n"; }B(const B&) { cout << "in B's copy constructor\n"; }~B() { cout << "in B's destructor\n"; }};class C: public B{ int z;A a;public:C() { cout << "in C's default constructor\n"; }C(const C&) { cout << "in C's copy constructor\n"; }~C() { cout << "in C's destructor\n"; }};void func1(C x){ cout << "In func1\n";}void func2(C &x){ cout << "In func2\n";}int main(){ cout << "------Section 1------\n";C c;cout << "------Section 2------\n";func1(c);cout << "------Section 3------\n";func2(c);cout << "------Section 4------\n";return 0;}答:------Section 1------in B's default constructorin A's default constructorin C's default constructor------Section 2------in B's default constructorin A's default constructorin C's copy constructorIn func1in C's destructorin A's destructorin B's destructor------Section 3------In func2------Section 4------in C's destructorin A's destructorin B's destructor5、写出下面程序的运行结果:#include <iostream>using namespace std;class A{ int x,y;public:A() { cout << "in A's default constructor\n"; f(); }A(const A&) { cout << "in A's copy constructor\n"; f(); }~A() { cout << "in A's destructor\n"; }virtual void f() { cout << "in A's f\n"; }void g() { cout << "in A's g\n"; }void h() { f(); g(); }};class B: public A{ int z;public:B() { cout << "in B's default constructor\n"; }B(const B&) { cout << "in B's copy constructor\n"; }~B() { cout << "in B's destructor\n"; }void f() { cout << "in B's f\n"; }void g() { cout << "in B's g\n"; }};void func1(A x){ x.f();x.g();x.h();}void func2(A &x){ x.f();x.g();x.h();}int main(){ cout << "------Section 1------\n";A a;A *p=new B;cout << "------Section 2------\n";func1(a);cout << "------Section 3------\n";func1(*p);cout << "------Section 4------\n";func2(a);cout << "------Section 5------\n";func2(*p);cout << "------Section 6------\n";delete p;cout << "------Section 7------\n";return 0;}答:------Section 1------in A's default constructorin A's fin A's default constructorin A's fin B's default constructor------Section 2------in A's copy constructorin A's fin A's fin A's gin A's fin A's gin A's destructor------Section 3------in A's copy constructorin A's fin A's fin A's gin A's fin A's gin A's destructor------Section 4------in A's fin A's gin A's fin A's g------Section 5------in B's fin A's gin B's fin A's g------Section 6------in A's destructor------Section 7------in A's destructor6、利用习题6.8的第14题中的时间类Time,定义一个带时区的时间类ExtTime。

c 继承与派生习题答案

c  继承与派生习题答案

继承与派生概念填空题1.1在C++中,三种派生方式的说明符号为public、private、protected不加说明,则默认的派生方式为private。

1.2当公有派生时,基类的公有成员成为派生类的公有成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。

当保护派生时,基类的公有成员成为派生类的保护成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。

1.3 派生类的构造函数一般有3项工作要完成:首先基类初始化,其次成员对象初始化,最后执行派生类构造函数体。

1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。

在派生类中采用虚基类或作用域分辨符来消除该问题。

3.选择题3.1下面对派生类的描述中,错误的是(D )。

A.一个派生类可以作为另外一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类中保持不变3.2下列对友元关系叙述正确的是(A)。

A.不能继承B.是类与类的关系C.是一个类的成员函数与另一个类的关系D.提高程序的运行效率3.3当保护继承时,基类的(B)在派生类中成为保护成员,不能通过派生类的对象来直接访问。

A.任何成员B.公有成员和保护成员C.公有成员和私有成员D.私有成员3.4设置虚基类的目的是(B)。

A.简化程序B.消除二义性C.提高运行效率D.减少目标代码3.5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是(C )。

A.派生类的对象可以赋给基类的对象B.派生类的对象可以初始化基类的引用C.派生类的对象可以直接访问基类中的成员D.派生类的对象的地址可以赋给指向基类的指针3.6有如下类定义: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;}};则类MyDERIVED中保护成员个数是(B)。

实验八 派生与继承参考答案

实验八 派生与继承参考答案
return 0;
}
结果截图:
11.3
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
protected:
int num;
string name;
char sex;
};
class Student1:protected Student{
stud1.get_value1();
stud1.display1();
return 0;
}
结果截图:
8.3
#include<string>
using namespace std;
class Student
{
public:
void get_value()
{
cin>>num>>name>>sex;
}
void display()
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
实验八
8.1
1.理解继承的含义以及声明;
2.理解共有派生、私有派生和保护派生的含义以及使用;
8.2
8.2.1
1.完成例题11.1—11.3,使其输出正确结果。
11.1
#include<iostream>
#include<string>
using namespace std;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验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 类图
三、实验步骤
1.(编程)声明基类Animal,成员变量age声明为私有的。

构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:(注:在桌面创建一个文本文件,将输出框的内容复制到文本文件中,再复制
★程序及运行结果:
1> f:\projects\cpp\cpp\main.cpp(5) : 参见“Animal”的声明
1>
1>生成失败。

1>
1>已用时间00:00:03.28
========== 生成: 成功0 个,失败1 个,最新0 个,跳过0 个==========
用public时的结果:
2.(编程)声明一个基类BaseClass,构造其派生类DerivedClass。

在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。

程序名:lab7_2.cpp。

参考的运行结果:
★程序及运行结果:
//lab7_2.cpp
#include<iostream>
using namespace std;
class BaseClass{
public:
BaseClass(){ cout<<"构造了一个BaseClass类的对象."<<endl; }
~BaseClass(){ cout<<"析构了一个BaseClass类的对象."<<endl; }
private:
int Number;
};
class DeriveClass:public BaseClass{
public:
DeriveClass(){ cout<<"构造了一个DeriveClass类的对象."<<endl; }
~DeriveClass(){ cout<<"析构了一个DeriveClass类的对象."<<endl; }
};
void main()
{ DeriveClass a; }
3.(操作)用调试功能跟踪程序lab7_2的执行过程。

观察基类和派生类的构造函数和析构函数的执行情况。

4.(编程)声明一个车(vehicle)虚基类。

由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。

再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。

程序名:lab7_3.cpp。

参考的运行结果:
★程序及运行结果:
//lab7_3.cpp
#include<iostream>
using namespace std;
class vehicle{//车类,作为基类
protected:
int MaxSpeed,Weight;//最大速度,重量
public:
void Run(){ cout<<"车vehicle类开始运行!"<<endl; }
void Stop(){ cout<<"车vehicle类停止运行!"<<endl; }
};
class bicycle:virtual public vehicle{//自行车类:公有继承虚基类vehicle
protected:
int Height;//高度
};
class motorcar:virtual public vehicle{//汽车类:公有继承虚基类vehicle
protected:
int SeatNum;//座位数
};
class motorcycle
:public bicycle,public motorcar{//摩托车类:公有继承自行车类和汽车类public:
void Setdata(int ms,int wt,int ht,int sn)
{ MaxSpeed=ms; Weight=wt; Height=ht; SeatNum=sn; };
void Show(){
cout<<"最大速度:"<<MaxSpeed<<" 重量:"<<Weight
<<" 高度:"<<Height<<" 座位数:"<<SeatNum<<endl;
}
};
void main(){
cout<<"int类型占用字节数: "<<sizeof(int)<<endl;
cout<<"vehicle占用字节数: "<<sizeof(vehicle)<<endl;
cout<<"bicycle占用字节数: "<<sizeof(bicycle)<<endl;
cout<<"motorcar占用字节数: "<<sizeof(motorcar)<<endl;
cout<<"motorcycle占用字节数: "<<sizeof(motorcycle)<<endl;
motorcycle mt;
mt.Run();
mt.Setdata(100,200,130,2);
mt.Show();
mt.Stop();
}
为什么?
按推算应该是:
vehicle占用8字节;
bicycle占用12字节;
motorcar占用12字节;
motorcycle占用16字节。

5.(验证)把vehicle设置为非虚基类。

再编译一次,此时系统报错,无法编译成功。

这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。

访问vehicle的成员时指明继承路径后,可以纠正二义性错误,试修改程序,然后运行。

★程序的运行结果:
(1) 没有指明继承路径(运行结果)
将上面的程序的bicycle类和motorcar类改为非虚基类公有继承vehicle类后,编译时
(2) 指明继承路径(程序及运行结果)
将vehicle中数据成员和函数成员指明路径。

mt.Setdatabicycle(100,200,130,2);
mt.Showbicycle();
mt.motorcar::Stop();//修改,指明路径
}
6. 以实验6中的people(人员)类为基类,派生相应的类。

按任务7_4的要求编写程序,并运行。

参考的运行结果:
★程序及运行结果:
(1) lab6_7.h:People(人员)类的声明及成员函数的实现
(2) lab7_4.h:People类的派生类
(3) lab7_4.cpp:主函数(测试)
(4) 结果。

相关文档
最新文档