分享
 
 
 

C++习题与解析-继承和派生

王朝c/c++·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

6.1 分析以下程序的执行结果

#include<iostream.h>

class base

{

public:

base(){cout<<"constrUCting base class"<<endl;}

~base(){cout<<"destructing base class"<<endl; }

};

class subs:public base

{

public:

subs(){cout<<"constructing sub class"<<endl;}

~subs(){cout<<"destructing sub class"<<endl;}

};

void main()

{

subs s;

}

解:

本题说明单继续情况下构造函数和析构函数的调用顺序。这里base为基类,subs为派生类。

所以输出为:

constructing base class

constructing sub class

destructing sub class

destrcuting base class

注重:在单继续情况下,首先调用基类的构造函数 ,随后调用派生类的构造函数,析构函数的调用顺序则正好相反。

---------------------------------------------------

6.2 分析以下程序的执行结果:

#include<iostream.h>

class base

{

int n;

public:

base(int a)

{

cout<<"constructing base class"<<endl;

n=a;

cout<<"n="<<n<<endl;

}

~base(){cout<<"destructing base class"<<endl;}

};

class subs:public base

{

base bobj;

int m;

public:

subs(int a,int b,int c):base(a),bobj(c)

{

cout<<"constructing sub cass"<<endl;

m=b;

cout<<"m="<<m<<endl;

}

~subs(){cout<<"destructing sub class"<<endl;}

};

void main()

{

subs s(1,2,3);

}

解:

本题说明 派生类中含有对象成员情况下构造函数和析构函数的调用顺序。这里base为基类,subs为派生类,subs类的构造函数中含有对象成员。

所以输出为:

constrcuting base class

n=1

constructing base class

n=3

constructing sub class

m=2

destructing sub class

destructing base class

destructing base class

注重:当派生类中含有对象成员时,构造函数的调用顺序如下:

1)基类的构造函数

2)对象成员的构造函数

3)派生类的构造函数

析构函数的调用顺序与之相反

-------------------------------------------------

6.3 分析以下程序的执行结果

#include<iostream.h>

class A

{

public:

int n;

};

class B:public A{};

class C:public A{};

class D:public B,public C

{

int getn(){return B::n;}

};

void main()

{

D d;

d.B::n=10;

d.C::n=20;

cout<<d.B::n<<","<<d.C::n<<endl;

}

解:

D类是从类和类派生的而类和类又都是从类派生的,但各有自己的副本。所以对于对象d,d.B::n与d.C::n是两个不同的数据成员它们互无联系。

所以输出为:

10,20

--------------------------------------------

6.4 分析以下程序的执行结果

#include<iostream.h>

class A

{

public:

int n;

};

class B:virtual public A{};

class C:virtual public A{};

class D:public B,public C

{

int getn(){return B::n;}

};

void main()

{

D d;

d.B::n=10;

d.C::n=20;

cout<<d.B::n<<","<<d.C::n<<endl;

}

解:

D类是从类和类派生的而类和类又都是从类派生,但这是虚继续关系即是虚基类因此和共用一个的副本所以对于对象d,d.B::n与d.C::n是一个成员。

所以输出为:

20,20

---------------------------------------

6.5 假设图书馆的图书包含书名、编号作者属性读者饮包含姓名和借书证属性每位读者最多可借5本书,编写程序列出某读者的借书情况。

解:

设计一个类,从它派生出胃病书类book和读者类reader,在reader类中有一个rentbook()成员函数用于借阅图书。

程序代码如下:

本程序的执行结果如下:

#include<iostream.h>

#include<string.h>

class object

{

char name[20];

int no;

public:

object(){}

object(char na[],int n)

{

strcpy(name,na);no=n;

}

void show()

{

cout<<name<<"("<<no<<")";

}

};

class book:public object

{

char author[10];

public:

book(){}

book(char na[],int n,char auth[]):object(na,n)

{

strcpy(author,auth);

}

void showbook()

{

show();

cout<<"作者:"<<author;

}

};

class reader:public object

{

book rent[5];

int top;

public:

reader(char na[],int n):object(na,n){top=0;}

void rentbook(book &b)

{

rent[top]=b;

top++;

}

void showreader()

{

cout<<"读者:";show();

cout<<endl<<"所借图书:"<<endl;

for(int i=0;i<top;i++)

{

cout<<" "<<i+1<<":"; // 5个空格

rent[i].show();

cout<<endl;

}

}

};

void main()

{

book b1("C语言",100,"谭浩强"),b2("数据结构",110,"严蔚敏");

reader r1("王华",1234);

r1.rentbook(b1);

r1.rentbook(b2);

r1.showreader();

}

读者王华(1234)

所借图书:

1:C语言(100)

2:数据结构(110)

6.6 编写一个程序设计一个汽车类vehicle,包含的数据成员有车轮个数wheels和车重weight。小车类car是它的私有派生类其中包含载人数passenger_load。卡车类truck是vehicle的私有派生类其中包含载人数passenger_load和载重量payload,每个类都有相关数据的输出方法。

解:

vehicle类是基类由它派生出car类和truck类将公共的属性和方法放在vehicle类中。

本题程序如下:

本程序的执行结果如下:

#include<iostream.h>

class vehicle // 定义汽车类

{

protected:

int wheels; // 车轮数

float weight; // 重量

public:

vehicle(int wheels,float weight);

int get_wheels();

float get_weight();

float wheel_load();

void show();

};

class car:public vehicle // 定义小车类

{

int passenger_load; // 载人数

public:

car(int wheels,float weight,int passengers=4);

int get_passengers();

void show();

};

class truck:public vehicle // 定义卡车类

{

int passenger_load; // 载人数

float payload; // 载重量

public:

truck(int wheels,float weight,int passengers=2,float max_load=24000.00);

int get_passengers();

float efficiency();

void show();

};

vehicle::vehicle(int wheels,float weight)

{

vehicle::wheels=wheels;

vehicle::weight=weight;

}

int vehicle::get_wheels()

{

return wheels;

}

float vehicle::get_weight()

{

return weight/wheels;

}

void vehicle::show()

{

cout << "车轮:" << wheels << "个" << endl;

cout << "重量:" << weight << "公斤" << endl;

}

car::car(int wheels, float weight,

int passengers) :vehicle (wheels, weight)

{

passenger_load=passengers;

}

int car::get_passengers ()

{

return passenger_load;

}

void car::show()

{

cout <<" 车型:小车" << endl;

vehicle::show();

cout << "载人:" << passenger_load << "人" << endl;

cout << endl;

}

truck:: truck(int wheels, float weight,int passengers, float max_load):vehicle(wheels,weight)

{

passenger_load=passengers;

payload=max_load;

}

int truck::get_passengers()

{

return passenger_load;

}

float truck::efficiency()

{

return payload/(payload+weight);

}

void truck::show()

{

cout <<"车型:卡车" << endl;

vehicle:: show ();

cout << "载人:" << passenger_load << "人" << endl;

cout << "效率:" << efficiency() << endl;

cout << endl;

}

void main ()

{

car car1(4,2000,5);

truck tru1(10,8000,3,340000);

cout << "输出结果" << endl;

car1. show ();

tru1. show ();

}

输出结果

车型:小车

车轮:4个

重量:2000公斤

载人:5人

车型:卡车

车轮:10个

重量:8000公斤

载人:3人

效率:0.977012

--------------------------------------------------------

6.7 设计一个圆类circle和一个桌子类table,另设计一个圆桌类roundtable,它是从前两个类派生的,要求输出一个圆桌的高度、面积和颜色等数据。

解:

circle类包含私有数据成员radius和求圆面积的成员函数getarea();table类包含私有数据成员height和返回高度的成员函数getheight()。roundtable类继续所有上述类的数据成员和成员函数,添加了私有数据成员color和相应的成员函数。本题程序如下:

#include<iostream.h>

#include<string.h>

class circle

{

double radius;

public:

circle(double r) { radius=r; }

double getarea() { return radius*radius*3.14; }

};

class table

{

double height;

public:

table(double h) { height=h; }

double getheight() { return height; }

};

class roundtable : public table,public circle

{

char *color;

public:

roundtable(double h, double r, char c[]) : circle (r) , table (h)

{

color=new char[strlen(c)+1];

strcpy (color, c);

}

char *getcolor() { return color; }

};

void main()

{

roundtable rt(0.8,1.2,"黑色");

cout << "圆桌属性数据:" << endl;

cout << "高度:" <<rt.getheight() << "米" << endl;

cout << "面积:" <<rt.getarea() << "平方米" << endl;

cout << "颜色:" <<rt.getcolor() << endl;

}

本程序的执行结果如下:

圆桌属性数据:

高度:0.8米

面积:4.5216平方米

颜色:黑色

-------------------------------------------------------

6.8 设计一个虚基类base,包含姓名和年龄私有数据成员以及相关的成员函数,由它派生出领导类leader,包含职务和部门私有数据成员以及相关的成员函数。再由base派 生出工程师类engineer,包含职称和专业私有数据成员以及相关的成员函数。然后由1eda和engineer类派生出主任工程师类chairman。采用一些数据进行测试。

解:

由于chairman类从leader类和engineer类派生,而leader类和engineer类都是从base类派生的,所以为了使base只存一个副本,必须采用虚拟派生的方法。

本题程序如下:

#include<iostream.h>

#include<string.h>

class base // 基类

{

char* name;// 姓名

int age; // 年龄

public:

base(){}

void setname(char na[])

{

name=new char[strlen(na)+1];

strcpy(name,na);

}

void setage(int a)

{

age=a;

}

char* getname() { return name; }

int getage() { return age; }

};

class leader:virtual public base // 领导类

{

char *job;//职务

char *dep;//部门

public:

leader() { }

void setjob(char jb[])

{

job=new char[strlen(jb)+1];

strcpy (job, jb);

}

void setdep(char dp[])

{

dep=new char [strlen (dp) +1] ;

strcpy (dep, dp);

}

char *getjob() { return job; }

char *getdep() { return dep; }

};

class engineer:virtual public base // 工程师类

{

char *major; // 专业

char *prof; // 职称

public:

engineer () { }

void setmajor(char maj [])

{

major=new char[strlen(maj)+1];

strcpy (major,maj);

}

void setprof(char pf[])

{

prof=new char[strlen(pf)+1];

strcpy (prof, pf);

}

char*getmajor() {return major; }

char*getprof() {return prof; }

} ;

class chairman:public leader,public engineer // 主任工程师类

{ } ;

void main()

{

chairman c;

c.setname("李明");

c.setage(42);

c.setjob("处长");

c.setdep("设计处");

c.setmajor("电站锅炉设计");

c.setprof("高级工程师");

cout<< "输出结果:"<<endl;

cout << " " << c.getname() << ",年龄" << c.getage()<<"岁,担任" <<c.getdep() <<c.getjob() <<","<<endl;

cout << " " << c.getprof() << ",从事" << c.getmajor()<< "专业" << "。 " << endl;

}

本程序的执行结果如下:

输出结果:

李明,年龄42岁,担任设计处处长,

高级工程师,从事电站锅炉设计专业。

三层交换技术

交换机与路由器密码恢复

交换机的选购

路由器设置专题

路由故障处理手册

数字化校园网解决方案

题 1. 分析以下程序的执行结果:

#include<iostream.h>

class base

{

int n;

public:

base(){};

base (int a)

{

cout << "constructing base class" << endl;

n=a;

cout << "n=" << n << endl;

}

~base() { cout << "destructing base class" << endl; }

};

class subs : public base

{

int m;

public:

subs(int a, int b) : base(a)

{

cout << "constructing sub class" << endl;

m=b;

cout << "m=" << m << endl;

}

subs() { cout << "destructing sub class" << endl; }

};

void main ()

{

subs s(1,2);

}

解:

这里base 是基类,subs为派生类,subs类的构造函数中含有调用基本类的构造函数。

所以输出为:

constructing base class

n=1

constructing sub class

n=2

destructing base class

destructing sub class

-----------------------------------------------------

题 2.分析以下程序的执行结果:

#include <iostream.h>

class Sample

{

protected:

int x;

public:

Sample() { x=0; }

Sample(int val) { x=val; }

void operator++() { x++; }

};

class Derived:public Sample

{

int y;

public:

Derived():Sample(){ y=0; }

Derived(int val1,int val2):Sample(val1){ y=val2; }

void operator--(){ x--;y--;}

void disp()

{

cout<<"x="<< x <<" y=" << y << endl; f

}

};

void main ()

{

Derived d(3,5);

d.disp();

d++;

d.disp ();

d--;

d--;

d.disp();

}

解:

所有运算都是对x而言的。

所以输出为:

x=3, y=5

x=4,y=5

x=2,y=5

--------------------------------------------------------------

题 3 分析以下程序的执行结果:

#include <iostream.h>

class A

{

int a;

public:

A(int i) { a=i;cout << "constructing class A" << endl; }

void print() { cout << a << endl; }

~A() { cout << "destructing class A" << endl; }

};

class Bi:public A

{

int bl;

public:

Bl(int i,int j):A(i)

{

bl=j;cout << "constructing class BI" << endl;

void print()

{

A::print ();

cout << bl << endl;

}

~BI(){ cout << "destructing class BI" << endl; }

};

class B2:public A

{

int b2;

public:

B2(int i,int j):A(i);

{

b2=j;cout << "constructing class B2" << endl;

}

void print()

{

A::print ();

cout << b2 << endl;

}

~B2() { cout << "destructing class B2" << endl; }

};

class C:public B1,public B2

{

int c;

public:

C(int i,int j,int k, int 1,int m) :Bl(i,j),B2(k,1),c(m)

{

cout << "constructing class C" << endl;

}

void print()

{

Bl::print();

B2::print();

cout << c << endl;

}

~C( ){ cout << "destructing class C" << endl; }

};

void main()

{

C c1(1,2,3,4,5);

cl.print();

}

解:

C类是从B1类和B2类派生的,而B1和B2类又都是从A类派生,但各有自己的副本,所有这些成员函数均有print()成员函数。所以,在C的成员函数实现中,调用print()时,要加上类作用域运算符“::”。

所以输出为:

constructing class A

constructing class B1

constructing class A

constructing class B2

constructing class C

1

2

3

4

5

destructing class C

destructing class B2

destructing class A

destructing class B1

destructing class A

-------------------------------------------------------

题 4 分析以下程序执行结果:

#include <iostream.h>

class A

{

public:

A(char *s) { cout << s << endl; }

~A() {}

};

class B:public A

{

public:

B(char *sl,char *s2) :A(sl)

{

cout << s2 << endl;

}

};

class C:public A

{

public:

C(char *sl,char *s2) :A(sl)

{

cout << s2 << endl;

}

};

class D:public B,public C

{

public:

D(char *sl,char *s2,char *s3,char *s4) :B(sl,s2),C(sl,s3)

{

cout << s4 << endl;

}

void main ()

{

D d("class A","class B","class C","class D");

}

解:

D类是从B和C类派生的,而B和C类又都是从A类派生,但各有自己的副本。

所以输出为:

class A

class B

class A

class C

class D

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有