}
public:
inty;
};
intmain()
{Derivedbb;
bb,setx(16);
bb.sety(25);
coutvv”
coutvv”
coutvv”coutvv”return0;
}
bb.showO;
Base:
:
x=”wbb.xwendl;Denved:
:
y=”wbb.ywendl;Base:
:
x=”wbb.getxQwendl;Derived:
:
y=”wbb.getyQwendl;
写出程序的运行结果。
Base;:
x=16
Base:
:
x-16Dei'iued:
:
y=2E
B込SE=;x=16Derived:
:
y=25
请按任意键继续...
(2)按以下要求,对程序进行修改后再调试,指出调试中出错的原因。
1将基类Base中数据成员x的访问权限改为private时,会出现哪些错误?
为什么?
2将基类Base中数据成员x的访问权限改为protected什么?
3在源程序的基础上,将派生类Derived的继承方式改为错误?
为什么?
4在源程序的基础上,将派生类Derived的继承方式改为些错误?
为什么?
时,会出现哪些错误?
为
private时,会出现哪些
Protected时,会出现哪
解答如下;
①将基类Base中数据成员x的访问权限改为private时,会出现哪些错误?
为什么?
Coifiling...
tyexpp
C;Wur)enbandSettings\fl(lii(iistratd.cpp[19);errorC32iiB:
'k':
cainotaccessprivatenenberdeclaredincl血'Ba&e'andStttiii^\fldnini5trat(ir\tye.cpp(10|:
血歯utionof
C;WunentsandSettings\fl(liiiiistralor\ti|P.cpp[291:
errorC22iiB:
'k':
cannot乳佣釣priuatenentterdeclaredincl?
和'Ba&p'C:
\imcijnentsandgottingH血ini刖血f训巴聊(10):
seefpcLaratianof'f
ErrorexecutingcI.eKe,
因为基类Base中数据成员x的访问权限改为private时,基类的私有成员在派生类中并没有成为派生类的私有成员,使得再通过派生类的对象调用x时,不能被系统所识别,出现了错误。
②将基类Base中数据成员x的访问权限改为protected时,会出现哪些错误?
为什么?
-Ccnfiquration:
rtuif-盛们2蚀Mq
CDnpilLig...
rhj^.cpp
C:
\DacuneiitsandSfttiiigs\(1dnini&lrator\^5\rt»jy-cpp(2SI:
errorC22酹:
"e':
cannotaccessprotectedwrtcrdeclaredinclasslast'C:
\[>ocu™e(itsandFMti呗帥ni血Hator、桌耐rtiij■唧⑴];seededdNlinndF'f
Errarwecutingcl.eife.
r训』bj-1error[s),0祈fni叫(5)
因为基类Base中数据成员x的访问权限改为protected时,公用基类的保护成员在公用派生类中的访问属性仍然是保护,在公用派生类外就不能通过公用派生类的对象访问该成员,所以出现了错误。
③在源程序的基础上,将派生类Derived的继承方式改为private时,会出现哪
些错误?
为什么?
切甲ili凹
rtuy.cpp
C:
\Dacunfit£andSeCting^tOdunistr.cpp(2AJ:
error血岖:
'set*':
cannotmenpublicnenherdttlarrdin□砧s"臨e'C:
\Dociinentsandttlngs\Adnnistrator-0(1()CS]:
seed^cl^ratiait肝'ietx'
C:
\Cocunentsand昶tting斟MnniEt恂toiA臬血rtu卜叩p寿):
errarC22iiS:
'x':
cannotaccES?
publiEhiMwdtclar^dinclass'Bast'C:
\DvcunfntsiniSettingsVfldiiiiiistraterV^.eppC1B);itsdfcljratiuncf'n'
匸:
训ocunp血iniSettingi^ndnnistrjtar\^.epp(31):
frrorC221i8:
'gptit':
cannotaccesspublicnpnherd^clar^dincl^ss'臨丁C:
\[iacuinBnt£andSetCingsMKliiinislritor面肝tuy.cpp⑴:
SfedfCl^NtionoF'gelK'
ErrorexFciiting
rluy*cbj-3trror估h8uarringf^)
将派生类Derived的继承方式改为private时,私有基类中的公用成员在私有派生类中的访问属性为私有,在类外不能通过对象调用私有成员,只能通过成员函数调用.
④在源程序的基础上,将派生类Derived的继承方式改为protected时,会出现
哪些错误?
为什么?
ConfiguratiDll:
t-Win眈Debug
佃叩iling+r
t.cpp
c;\[]ocuiipiitsandsetting5\adninistrator\Lcpp[26):
errorC22i(8:
'sptx':
cannotaccesspubliciKidprdeclaredincUss'Base'c:
\docuw[itsandsettings\iJuinistratar\t,cpp(E);seedeclarationof'seh'
c:
\docuiipiitsandsettings\adninistrator\Lcpp[29):
error促测:
*:
cdirnotaccesspublicnemberdeclaredinclass'Base*c:
ld(Miwntsandsettings\jdninisttQr\t.cpp(1fl):
5eetiHlmration肝霍‘
因为私有继承时基类中的公有函数到派生类中一是私有成员,不能通过对象访问,
只能通过成员函数来访问。
2.编写一个学生和教师的数据输入和显示程序。
学生数据有编号、姓名、性别、年龄、系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。
要求将编号、姓名、性别、年龄的输入和显示设计成一个类Person,并作为学生类Student和教师
类Teacher的基类。
供参考的类结构如下:
classPerson{
};
classStudent:
publicPerson{
};
classTeacher:
publicPerson{};
程序代码:
#include
#includevstring>
usingnamespacestd;
classPerson
{public:
Person(intn,stringnam,chars,inta)
{num=n;
name=nam;
sex=s;
age=a;
}
~Person(){}
protected:
intnum;
stringname;
charsex;
intage;
};
classStudent:
publicPerson
{public:
Student(intn,stringnam,chars,inta,stringap,intsc):
Person(n,nam,s,a)
{apart=ap;
score=sc;
}
voidshow1()
{coutvv"num:
"vvnumvvendl;
coutvv"name:
"vvnamevvendl;coutvv"sex:
"vvsexvvendl;
coutvv"age:
"vvagevvendl;
coutvv"apart:
"vvapartvvendl;
coutvv"score:
"vvscorevvendlvvendl;
}
~Student(){}
private:
stringapart;
intscore;
};
classTeacher:
publicPerson
{
public:
Teacher(intn,stringnam,chars,inta,stringz,stringt):
Person(n,nam,s,a)
{zhi=z
title=t;
}
voidshow2()
{coutvv"num:
"vvnumwendl;coutvv"name:
"vvname<"vvsexvvendl;coutvv"age:
"vvagevvendl;coutvv"zhi:
"vvzhivvendl;coutvv"title:
"vvtitlevvendl;
}
~Teacher(){}
private:
stringzhi;
stringtitle;
};
intmain()
{StudentS(1001,"yang-heng",f,21,"computer",98);
TeacherT(2009,"li-sheng",f,35,"manager","education");
S.show1();
T.show2();
return0;
}
程序运行结果:
匚ir]回:
删悯刪顾蹄Mr™
nun:
1阿01
name:
yang-heng
sex:
f
age;21
apart■conputei*
score198
nun:
2^09nane:
li-sliens(scx:
fage:
35
2himanasTtrtitle:
edueation请按任意键继续.
(3)调试程序时会出现以下错误:
调用函数是应注意其访问权限,基类函数的私有成员只能被其成员函数访问,不能被派生类的对象和成员函数所访问,还要注意调用派生类的构造函数时的参数列表表达形式。
(4)结果分析:
注意构造函数和派生类调用基类的构造函数赋值,在后面对新增的参数初始化,通过对象赋值后再对其输出。
3.按要求阅读、编辑、编译、调试和运行以下程序。
(1)阅读、编辑、编译、调试和运行以下程序,并写出程序的运行结果。
//test4_3_1.cpP
#include
#include
usingnamespacestd;
classMyArray{
public:
MyArray(intleng);
~MyArray();
voidInput();
voidDispIay(string);
protected:
int*alist;
intlength;
};
MyArray:
:
MyArray(intleng)
{if(lengv=0)
{coutvv"errorlength";
exit
(1);
}
alist=newint[leng];
length=leng;if(alist==NULL){cout<<"assignfailure";
exit
(1);
"<}cout<<"MyArray类对象已创建。
}
MyArray:
:
~MyArray()
"<{delete[]alist;cout<<"MyArray类对象被撤销。
}
voidMyArray:
:
Display(stringstr)
{inti;
int*p=alist;
H・
coutvvstrvviengthw"个整数:
for(i=0;ivlength;i++,p++)
coutvv*pw"";
coutvvendl;
}
voidMyArray:
:
lnput()
{coutvv"请键盘输入"<";inti;
int*p=alist;
for(i=0;ivlength;i++,p++)cin>>*p;
}
intmain()
{MyArraya(5);
a.Input();
a.Display("显示已输入的");return0;
}
1=1回
nyArra疥对象已创建*
W®盘输人5个整数江225171920显示已输入旌适整数:
1225171920请按任蟲克…
(2)声明一个类SortArray继承类MyArray,在该类中定义一个函数,具有将输入的整数从小到大进行排序的功能。
程序代码:
#includeviostream>
#includeusingnamespacestd;
classMyArray
{
public:
MyArray(intleng);-MyArrayO;
voidInput();voidDisplay(string);
protected:
int*alist;
intlength;};
classSortArray:
publicMyArray{public:
voidSort();
SortArray(intleng):
MyArray(leng){coutvv"SortArray类对象已创建。
"<}
virtual~SortArray();
};
SortArray:
:
~SortArray(){cout<<"SortArray类对象被撤销。
"<}
MyArray:
:
MyArray(intleng){if(lengv=0)
{cout<<"errorlength";exit
(1);
}
alist=newint[leng];length=leng;
if(alist==NULL)
{cout<<"assignfailure";exit
(1);
}coutvv"MyArray类对象已创建。
"<MyArray:
:
~MyArray()
{
delete[]alist;
coutvv"MyArray类对象被撤销。
"<}
voidMyArray:
:
Display(stringstr)
{inti;
int*p=alist;coutvvstrvviengthw"个整数:
";for(i=0;icoutvvendl;
}
voidMyArray:
:
Input()
{coutvv"请键盘输入"<";inti;
int*p=alist;
for(i=0;ivlength;i++,p++)cin>>*p;
}
voidSortArray:
:
Sort()
{inttemp,i,j;
for(i=0;ivlength-1;i++)
for(j=0;jvlength-1-i;j++)
if(alist[j]>alist[j+1])
{temp=alist[j];alist[j]=alist[j+1];alist[j+1]=temp;
}intmain(){SortArrays(5);s.lnput();s.Display("显示排序以前的");s.SortO;
s.Display("显示排序以后的");return0;
}
程序运行结果:
I'C:
\Users\dell\Documents\C-Free\TennS1.exe"
--*——一一T、-1^/■-—I—IJ严■
Soi*tArmy类对象已创建*
E
1695
256?
盘髄入5个嚳熱2169显示专時嵋睡鹰加Myftrra熾对無破徹辛筲亠请按任蟲翳.•-
(2).声明一个类ReArray继承类MyArray,在该类中定义一个函数,具有将输入的整数进行倒置的功能。
程序代码:
#includeviostream>
#include
usingnamespacestd;
classMyArray{
public:
MyArray(intleng);
-MyArrayO;
voidInput();
voidDisplayGtring);
protected:
int*alist;
intlength;
};
classReArray:
publicMyArray{
public:
voidreverse();
-ReArrayO
{coutvv"ReArray类对象被撤销。
"wendl;
};
ReArray(intleng):
MyArray(leng){coutvv"ReArray类对象已创建。
}
};
MyArray:
:
MyArray(intleng)
{if(lengv=O)
{cout<<"errorlength";exit
(1);
}
alist=newint[leng];
length=leng;if(alist==NULL){coutvv"assignfailure";exit
(1);
}cout<<"MyArray类对象已创建。
}
MyArray:
:
~MyArray()
{delete[]alist;cout<<"MyArray类对象被撤销。
}voidMyArray:
:
Display(stringstr){inti;int*p=alist;coutvvstrvviengthw"个整数:
";for(i=0;i}
voidMyArray:
:
Input()
{coutvv"请键盘输入"<";inti;
int*p=alist;
for(i=0;ivlength;i++,p++)cin>>*p;
}
voidReArray:
:
reverse()
{inti,temp;
for(i=0;ivlength-2;i++)
{temp=alist[i];alist[i]=alist[4-i];alist[4-i]=temp;
}
"<"<"<
intmain()
{ReArraya(5);
a.Input();
a.Display("显示已输入的");a.reverseO;
a.Display("显示已输出的");return0;
}
程序运行结果:
■C:
\UKrs\ckll\Doajment叭匚・卩阳科口阳戸\未DnSl.exe"
(3)声明一个类AverArray继承类MyArray,在该类中疋义一个函数,具有求输入的整数平均值的功能。
程序代码:
#includeviostream>
#includeusingnamespacestd;
classMyArray
{
public:
MyArray(intleng);
-MyArrayO;
voidInput();
voidDisplayGtring);
protected:
int*alist;
intlength;};
MyArray:
:
MyArray(intleng){if(lengv=0)
{cout<<"errorlength";exit
(1);
}
alist=newint[leng];length=leng;
if(alist==NULL)
{cout<<"assignfailure";exit
(1);
}cout<<"MyArray类对象已创建。
"<MyArray:
:
~MyArray()
{
delete[]alist;
cout<<"MyArray类对象被撤销。
"<voidMyArray:
:
Display(stringstr)
{inti;
int*p=alist;coutvvstrvviengthw"个整数:
";for(i=0;icoutvvendl;
}
voidMyArray:
:
Input()
{coutvv"请键盘输入"<";inti;
int*p=alist;for(i=0;ivlength;i++,p++)cin>>*p;
}
classAverArray:
publicMyArray{