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++语言程序设计实验答案_继承与派生实验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继承与派生习题答案
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++多继承 (附答案)
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 继承与派生参考答案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章继承――派生类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 继承与派生习题答案
继承与派生概念填空题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)。
实验八 派生与继承参考答案
}
结果截图:
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)掌握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++继承和派生编程参考答案
继承和派生练习一1.以日期类cDate(有数据成员年月日)为基类派生日期时间类cTime,新增数据成员时分秒,要求有构造函数、输出所有成员的函数,测试程序正确性。
#include<iostream.h>class cDay{int ye,mo,da;public:cDay(int a=2000,int b=1,int c=1){ye=a,mo=b,da=c;}void Dout(void){cout<<ye<<' '<<mo<<' '<<da<<endl;}};class cTime:public cDay{int ho,mi,se;public:cTime(int a=2000,int b=1,int c=1,int d=12,int e=12,int f=12):cDay(a,b,c){ho=d,mi=e,se=f;}void Tout(void){Dout();cout<<ho<<' '<<mi<<' '<<se<<endl;}};void main(void){cTime t1(2010,4,30,15,20,23);t1.Tout();}2.以三维坐标类cPoint为基类派生圆类cCircle,新增数据成员半径;再以圆类为基类派生圆柱体类cColumn,新增数据成员高度,要求有构造函数、输出所有成员的函数,在相关类中定义求圆面积的成员函数、求体积的成员函数,测试程序正确性。
#include<iostream.h>#define PI 3.1415926class cPoint{float x,y,z;public:cPoint(float a=1,float b=1,float c=1){x=a,y=b,z=c;}void Pout(void){cout<<"x="<<x<<" y="<<y<<" z="<<z;}};class cCircle:public cPoint{float r;public:cCircle(float a=1,float b=1,float c=1,float d=2):cPoint(a,b,c){r=d;}float area(void){return PI*r*r;}void Cout(void){Pout();cout<<" r="<<r;}};class cColumn:public cCircle{float h;public:cColumn(float a=1,float b=1,float c=1,float d=2,float e=3):cCircle(a,b,c,d){ h=e;}float v(void){return area()*h;}void Coout(void){Cout();cout<<" h="<<h<<endl;}};void main(void){cCircle t1(1,2,3,4);t1.Cout();cout<<" area="<<t1.area()<<endl;cColumn t2(2,3,4,5,6);t2.Coout();cout<<"v="<<t2.v()<<endl;}。
c++面向对象的程序设计单继承(附答案)
《面向对象程序设计》实验六继承和派生一、实验目的1、学习使用继承方式派生新类的方法。
2、加深对访问权限的理解。
3、掌握派生类构造函数和析构函数的调用次序。
二、实验内容实验一下列程序是从一个A类公有派生一个新类B的程序。
填空完善该程序,编译调试正确,写出运行结果。
# include <iostream.h>class A{int pri;protected:int pro;public:int pub;A(int i,int j,int k){pri=i; pro=j; pub=k;}void print(){cout<<"pri="<<pri<<"\tpro="<<pro<<"\tprb="<<pub<<endl;}};class B: (1){int i,j;A a1,a2;public:B(int x,int y)(2){i=x;j=y;}void print(){A(3)print();cout<<"i="<<i<<"\tj="<<j<<endl;a1.print();a2.print();}};void main(){int c,d;cout<<"请输入两整数:"<<endl;(4)B(5)cout<<"sizeof(b)="<<sizeof(b)<<endl;(6)}完成程序后,运行结果为:实验二下列程序声明一个圆类circle和一个桌子类table,另外声明一个圆桌类roundtable,它是由circil和table两个类派生的,要求声明一个圆桌类对象,并输出圆桌的高度、面积和颜色。
最新《C++程序设计案例教程》习题答案第8章 类的继承与派生
第8章类的继承与派生一、选择题1.D 2.A 3.A 4.B 5.B 6.B二、程序题(略)三、简答题1.派生类对基类的继承方式有哪些?在派生类中,成员有几种不同的访问属性?答:派生类对基类的继承方式有三种:public、protected、private。
成员也有三种访问属性:public、protected、private。
2.多级派生的访问属性如何确定?答:多级派生的访问属性确定的原则与单层派生一致。
3. 在执行派生类时,如何调用基类的构造函数?答:在派生类构造函数的初始化列表中描述。
4. 对数据成员初始化时,如何对子对象初始化?答:在派生类构造函数的初始化列表中,写上子对象名(实际参数)。
5.程序中有多重继承时,系统如何调用析构函数?答:按照调用构造函数相反的顺序调用析构函数。
6.举例说明多重继承引起的二义性,如何解决此问题?多重继承指一个类从多个基类中派生而来。
如果一个派生类有多个直接基类,而这些直接基类又都派生于同一个基类,则在最终派生类中会保留间接基类中的多份数据成员,从而导致在派生类中访问这些数据成员时,可能产生错误,即二义性的错误。
C++提供了虚基类(virtual base class)的方法来解决这个问题,使得派生类在获得间接基类的数据成员时只保留一份拷贝。
7. 谈谈虚基类的作用。
在进行多重继承时,为保证最终派生类中只继承一次,通常声明该基类为所有直接派生类的虚基类。
如果虚基类中定义了带参数的构造函数,则在其所有的派生类(直接派生类或者间接派生类)中,必须通过这些派生类的构造函数对虚基类构造函数调用。
但是,其实只有最后的派生类成功地调用了虚基类的构造函数,并对虚基类的数据成员进行了初始化,其余派生类中对虚基类的调用只是形式,以形成派生类构造函数声明格式的一致性,而没有真正调用虚基类的构造函数。
这就保证了虚基类的数据成员不会被多次初始化。
四、编程题分别声明Teacher类和Cadre类,采用多重继承方式由这两个类派生出新类TC类。
实验九 派生与继承—构造与析构参考答案
实验九派生与继承——构造与析构函数9.1 实验目的1.理解派生类中构造函数和析构函数及其调用顺序。
2、理解虚基类的应用。
9.2 实验内容9.2.1程序阅读1.理解下面的程序,并运行查看结果,回答程序后面的问题。
#include <iostream>using namespace std;class CBase{public:CBase(int a):a(a){}void print(){cout<<"a="<<a<<endl;}private:int a;};class CDerive : public CBase{public:CDerive(int a,int s):CBase(a){b=s;}void print(){cout<<"b="<<b<<endl;}int b;};int main(){CDerive d(3,4);d.print();//-----------------------------------------------------①CBase b(4);b.print();//-----------------------------------------------------②return 0;}问题一:请指出①与②两处的print函数调用有何区别?答:①处是调用派生类CDerive的成员函数,在派生类中函数print()与基类中的print()同名,所以它会覆盖基类重中的print()函数,在调用函数时执行派生类的print()函数;而②处是调用CBase类的成员函数。
问题二:修改程序,使程序能输出基类的数据成员a。
答:1、在①处后面增加代码d.CBase::print();2、在派生类的print函数中增加语句CBase::print();2.理解下面的程序,并运行查看结果,回答程序后面的问题。
《派生与继承》课后习题 (含答案)
A. 首先调用基类构造函数 A(),其次调用构造函数 B(),最后执行派生类的构造函数 C()的函数体。 B. 首先调用构造函数 B(),其次调用基类构造函数 A(),最后执行派生类的构造函数 C()的函数体。 C. 首先执行派生类的构造函数 C()的函数体, 其次调用构造函数 B(), 最后调用基类构 造函数 A()。 D. 首先执行派生类的构造函数 C()的函数体, 其次调用基类构造函数 A(), 最后调用构 造函数 B()。 14、一个基类以私有方式派生时,其基类中的公有成员和保护成员在派生类中 是 A A.均成为私有的成员 C.均成为保护的成员 15、实现多态的派生类函数不一定要是 B A.与基类虚函数同名 C.与基类虚函数同参数表 B.用 virtual 修饰 D.与基类虚函数同返回类型 a1,*pa=&a1;B b1,*pb=&b1;”,则正确的赋 B.均成为公有的成员 D.仍为公有的和保护的成员
《派生与继承》习题
学号 一、选择题
姓名
1、假设 Person 类包含公有成员 name,私有成员 id 和受保护成员 GetID,而 Student 类私 有继承了 Person 类,那么 Student 类的成员函数可以直接访问 A.Person 类的所有成员 B.仅有 Person 类的公有成员 name C.仅有 Person 类的公有成员 name 和受保护成员 GetID D.Person 类的任何成员都不能访问 2、实现多态的派生类函数不必 A.与基类虚函数同名 C.与基类虚函数同返回类型 D B.与基类虚函数同参数表 D.用 virtual 修饰 C 。
A
B.派生类和基类中允许出现同名的成员数据或成员函数 C.在派生类构造对象时,首先调用基类的构造函数 D.派生类无法没有继承基类的私有成员 19、下列有关继承和派生的叙述中,不正确的是 AB
智慧树知到《C-C++程序设计》见面课答案
见面课:深入学习继承和派生1、问题:下列关于类的定义格式的描述中,错误的是()选项:A:类中成员有3种访问权限B:类的定义可分数据成员部分和成员函数部分C:类中成员函数都是公有的,数据成员都是私有的D:定义类的关键字通常用class,也可用struct答案: 【类中成员函数都是公有的,数据成员都是私有的】2、问题:下列关键字中,不属于定义类时使用的关键字是()选项:A:classB:protectedC:publicD:default答案: 【default】3、问题:下列定义对象的描述中,错误的是()选项:A:定义对象时系统会自动进行初始化B:对象成员的表示与C语言中结构变量的成员表示相同C:属于同一类的对象占有内存字节数相同D:一个类所能创建对象的个数是有限制的答案: 【一个类所能创建对象的个数是有限制的】4、问题:下列关于成员函数的描述中,错误的是()选项:A:成员函数的定义必须在类体外B:成员函数可以是公有的,也可以是私有的C:成员函数在类体外定义时,前加inline可为内联函数D:成员函数可以设置参数的默认值答案: 【成员函数的定义必须在类体外】5、问题:使用class定义的类,其默认的访问权限是公有的,使用struct定义的类,其默认的访问权限是私有的。
选项:A:对B:错答案: 【错】6、问题:下列关于基类和派生类的描述中,错误的是()选项:A:一个基类可以生成多个派生类B:基类中所有成员都是它的派生类的成员C:基类中成员访问权限继承到派生类中不变D:派生类中除了继承的基类成员还有自己的成员答案: 【基类中成员访问权限继承到派生类中不变】7、问题:下列关于继承的描述中,错误的是()选项:A:继承是重用性的重要机制B:C++语言只支持单重继承,不支持多重继承C:继承关系不是可逆的D:继承是面向对象程序设计语言的重要特性答案: 【C++语言只支持单重继承,不支持多重继承】8、问题:下列成员函数中,纯虚函数是()选项:A:virtual void f1()=0B:void f1()=0;C:virtual void f1(){}D:virtual void f1()==0答案: 【virtual void f1()=0】9、问题:派生类只继承基类中的公有成员和保护成员,而不继承私有成员。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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) 结果。