面试例题1:如果鸟是可以飞的,那么鸵鸟是鸟么?鸵鸟如何继承鸟类?[美国某著名分析软件公司2005年面试题]
b}'`!b/qG,d0解析:如果所有鸟都能飞,那鸵鸟就不是鸟!回答这种问题时,不要相信自己的直觉!将直觉和合适的继承联系起来还需要一段时间。51Testing软件测试网h;UF(rQe+X2K#M5n {7q
根据题干可以得知:鸟是可以飞的。也就是说,当鸟飞行时,它的高度是大于0的。鸵鸟是鸟类(生物学上)的一种。但它的飞行高度为0(鸵鸟不能飞)。
G$as(_3AZz3|
D0不要把可替代性和子集相混淆。即使鸵鸟集是鸟集的一个子集(每个驼鸟集都在鸟集内),但并不意味着鸵鸟的行为能够代替鸟的行为。可替代性与行为有关,与子集没有关系。当评价一个潜在的继承关系时,重要的因素是可替代的行为,而不是子集。
~_9ERo`GV8|*Y0答案:如果一定要让鸵鸟来继承鸟类,可以采取组合的办法,把鸟类中的可以被鸵鸟继承的函数挑选出来,这样鸵鸟就不是“a kind of”鸟了,而是“has some kind of”鸟的属性而已。代码如下:
g2Z8k JP0#include<iostream>
hxf"m1qG~0#include<string>51Testing软件测试网giOia-a`s|'PB
using namespace std;51Testing软件测试网:p{}7P`_
51Testing软件测试网zvdu5L6Q?
class bird
6`c5_!a%x#|/?|Ax.c0{51Testing软件测试网I;A7Q8T'd-k
public:51Testing软件测试网"k%^7Y%i:W[x+~c*p
Eq
void eat();51Testing软件测试网Q6u$R
O}|9^1i1xg4f
void sleep();51Testing软件测试网]%jA!E4l&g(s
void fly();51Testing软件测试网0U@_1ZD-h
};51Testing软件测试网oF(wVkLLS[~:K
51Testing软件测试网R*J8Q;uY7{
class ostrich51Testing软件测试网l,DQ,QoC'z
{51Testing软件测试网F$@}}fs
public:51Testing软件测试网@e2eD-_@Xb
bird eat(){cout<<"ostrich eat";};
8@&Su\}fk"H0 bird sleep(){cout<<"ostrich sleep";};
*I+o;cn^6]*e{&p0
.R0d BXc.Oe0 };
Tk?w#e3Xd5^ M0
&?
D8@U%[6c0int main()51Testing软件测试网1CO4Ek*B8Yv$m
{
rX's2{N5N`6f0 ostrich xiaoq;51Testing软件测试网M*p
\F"@i+L:k
xiaoq.eat();51Testing软件测试网vW0Xl)nL3r(}1_,p|
xiaoq.sleep();
S
F*g^:L0 return 0;51Testing软件测试网aU/HC\9B
}
W)iaLx2X.A*Uf0面试例题2:Find the defects in each of the following programs, and explain why it is incorrect.(找出下面程序的错误,并解释它为什么是错的。)[中国台湾某著名杀毒软件公司2005年面试题]
1~6BMQ
z$v/nW&Xv0 #include <iostream>
F,lsw:lz0 using namespace std;51Testing软件测试网SJ)}1^lW ]
51Testing软件测试网8q,f{Q6yk
class Base {
d'O8xO:KP g6ytp0 public:
e5L5BX*K$P\'zu+r0 int val;
a}+C4X8`E+T0 Base() { val=1;};
Hb&lOx0P4jp0 };51Testing软件测试网wr9VJe
51Testing软件测试网
ZJ GLkEM
class Derive: Base {51Testing软件测试网+h!IXj
ZY:J`/bN*fN
public:
,f1JuCTEP/\0 int val;51Testing软件测试网|WQTs-fhs,a
Derive(int i) { val=Base::val+i; };
;L4J G rMA.}S!k%lp O0 };
M
Rqy,krrCox5D2g0
.dBiu/E]/ik]%O9F.T0 int main(int, char**, char**) {51Testing软件测试网 nB2`Q O}
Derive d(10);51Testing软件测试网8Q$gQ7g)U:Zo.[
cout<<d.Base::val<<endl<<d.val<<endl;51Testing软件测试网u1O
a7H9n"B3H g
return 0;51Testing软件测试网$b-zu,Hv2`P
}
f![9r ?jf0答案:把class Derive: Base改成class Derive:public Base。51Testing软件测试网*aBNXt8Ct
解析:这是个类继承问题。如果不指定public,C++默认的是私有继承。私有继承是无法继承并使用父类函数中的公有变量的。
B9k0q5|h$AHnC
O0扩展知识(组合)这个比较有意思。
;f oC
w L0若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其他东西组合出B。51Testing软件测试网F,e{)o8n"u4Zf
例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head应该由类Eye、Nose、Mouth、Ear组合而成,而不是派生而成。程序如下:51Testing软件测试网)^a([Fs {~
[ FX
class Eye
/Y8HY8B!]Q Z s0{51Testing软件测试网3d9QTD6d*{q8?"i
public:
7AV"S!z;ts0void Look(void);
pxi o'a&J0};51Testing软件测试网0lhTGs
5aYkA7Zi{0class Nose51Testing软件测试网0A4Ht }x9QA#I
{51Testing软件测试网Kz^+|Znw
public:51Testing软件测试网|n,WV;Jo8W%k
j)C
void Smell(void);
{%ek/Iuc0};51Testing软件测试网EsKQ:T,H2I
-@0BVP?#YP0class Mouth
CYwJ9`
}9s0{51Testing软件测试网
['R}1g$h+p8O
public:51Testing软件测试网pUCLu0x
void Eat(void);
QK)J:g)M9G0};51Testing软件测试网(d\j]9L&@}2a:Xn
51Testing软件测试网m&\_h
L^\
cw
class Ear51Testing软件测试网e~U)t/]da.z
{51Testing软件测试网'T)M;NSg`
public:51Testing软件测试网+@ x/Ln2X-X&hh6^h
void Listen(void);51Testing软件测试网'INU]q%^
};
j;Jvo+~l8x.]-r0
MKg]#ah!I3AtB0class Head
4\s$M?R-A0{
[hS?3l0public:51Testing软件测试网@-Ay5y@
void Look(void) { m_eye.Look(); }
#~
t'L `1A0A:?Me(M0void Smell(void) { m_nose.Smell(); }
#k
U3O
o
}z0void Eat(void) { m_mouth.Eat(); }51Testing软件测试网 ^{b;Y)C2~2f
void Listen(void) { m_ear.Listen(); }
^h n*SN'[][}1ey0 51Testing软件测试网6j3{
t;{ ]9f8]
private:51Testing软件测试网 s6r4a:K \-n
Eye m_eye;51Testing软件测试网"e_.EJRWA
Nose m_nose;51Testing软件测试网
}e*R)T?dT
Mouth m_mouth;51Testing软件测试网|.rrs+H y
Ear m_ear;
0C @O0R#AP6b0};51Testing软件测试网,X4v2DTWG jP
Head由Eye、Nose、Mouth、Ear组合而成。如果允许Head从Eye、Nose、Mouth、Ear派生而成,那么Head将自动具有Look、Smell、Eat、Listen这些功能。程序十分简短并且运行正确,但是下面这种设计方法却是不对的。51Testing软件测试网Z^$tIk#GZ
class Head : public Eye, public Nose, public Mouth, public Ear
7h/~Dsg6y0{51Testing软件测试网z7XWTlIUo
};
6hw'@0O's+BhqkH0面试例题3:Find the defects in each of the following programs, and explain why it is incorrect.(找出下面程序的错误,并解释它为什么是错的。)[德国某著名软件咨询企业2005年面试题]51Testing软件测试网K-Fr"fc8M#n
class base{51Testing软件测试网4\(~)_xgt6}*q`PR
private: int i;
`7zXy&N0 public: base(int x){i=x;}
_:\*FNvTA0};
9ZS;w3fe?/e#{\x7i0class derived: public base{
'b]h$_SP;T0 private: int i;
BC"^y8v&Qm.XC0 public: derived(int x, int y) {i=x;}51Testing软件测试网Wo*J/w5`g
void printTotal() {int total = i+base::i;}
e4G5CkN`0};
y,U-vj'K9J-HD0解析:要在子类中设定初始成员变量,把derived(int x, int y)改成derived(int x, int y) : base(x)。
#od {Y_Z q?Q0答案:
2x)Z1]r/]{
W*d5U0代码如下:51Testing软件测试网N~Sno&R
class base51Testing软件测试网h*@*^o:F*\YC
{
k*@ A#r#[ l0protected: //这里的访问属性需要改变
\%x_{-Y6Awc8u}4Q0int i;
4Ac)vn
J'J9H0public: 51Testing软件测试网
dP6[AuE
^
base(int x){i=x;}
)aAN
b*X1DQ h'm0};
2I,H}x3y+S-L0
F8l'sr^"Tp8nT&y5}0class derived: public base
R-y
zP,`0{51Testing软件测试网.x,VM-bv \8kS t
private: 51Testing软件测试网$EC&k\Yoe
int i;51Testing软件测试网P!O7Q[l$BT Tj4d QK
public:51Testing软件测试网D6}
z[:Dc GH
derived(int x, int y) : base(x) //以前没有初始化基类的成员变量
c#rF
] }.G0 {
'Z$k+ca0S1e t0 i=y;
:s+k!VR4qE
T(D0 }
{v0WCNPCN1[0 void printTotal()
0O,yH mAx0y0 {51Testing软件测试网uNvN$C
int total = i+base::i;
0it$d s{w0 }51Testing软件测试网j3G+Ng|f#V,XT:|
};
\a'N"PU!i9jZs0 51Testing软件测试网#| \SFjre
51Testing软件测试网C~6\+k_