A(int a):x(a){ cout<<\ int f(){ return ++x; }
~A(){cout<<\private: int x; };
class B:public virtual A{ private: int y; A Aobj; public:
B(int a,int b,int c):A(a),y(c),Aobj(c){ cout<<\ int f(){ A::f(); Aobj.f(); return ++y; }
void display(){ cout<
~B(){cout<<\ };
class C:public B{ public:
C(int a,int b,int c):B(a,b,c),A(0){ cout<<\};
class D:public C,public virtual A{ public:
D(int a,int b,int c):C(a,b,c),A(c){ cout<<\ ~D(){cout<<\};
void main(){ D d(7,8,9); d.f();
d.display(); } 答:
从上到下A constructor...9 依次为: A constructor...9
B constructor...9 C constructor... D constructor...
12 12 11 destructor D....
destructor B... destructor A... destructor A...
4.5. 第5章 多态性(P156~157)
1、 请阅读程序,根据虚函数的特性,按顺序写出程序的运行结果。(P156,第4
(1)题,ex5-4-1.cpp) #include
Base(int m){ n=m++; }
virtual void g1(){ cout<<\ g4(); } virtual void g2(){ cout<<\ virtual void g3(){ cout<<\g4(); } virtual void g4(){ cout<<\} };
class Derived:public Base{ //公有继承 int j; public:
Derived(int n1,int n2):Base(n1){ j=n2; }
void g1(){ cout<<\g2(); } void g3(){ cout<<\g4(); } };
void main(){
Derived Dobj(1,0); Base Bobj=Dobj; Bobj.g1();
cout<<\ Base *bp=&Dobj; bp->g1();
cout<<\ Base &bobj2=Dobj; bobj2.g1();
cout<<\ Dobj.g1(); } 答:
从上到下Base::g1()...1 依次为: Base::g4()...2
------------------
Deri::g1()...2 Base::g2()...3 Deri::g2()...4 Base::g4()...5 ------------------ Deri::g1()...6 Base::g2()...7 Deri::g2()...8 Base::g4()...9 ------------------ Deri::g1()...10 Base::g2()...11 Deri::g2()...12 Base::g4()...13
2、 请阅读程序,根据虚函数和纯虚函数的定义与特性,按顺序写出程序的运行
结果。(P156,第4(2)题,ex5-4-2.cpp) #include
virtual double area(){ return 0; } virtual void print()=0; };
class Circle:public Shape{ protected: double r; public:
Circle(double x):r(x){ }
double area(){ return 3.14*r*r; } //(1) void print(){ cout<<\//(2) };
class Cylinder:public Circle{ double h; public:
Cylinder(double r,double x):Circle(r),h(x){ }
double area(){ return 2*3.14*r*r+2*3.14*h; } //(3) };
void shapeArea(Shape &s){ cout<
s[0]=&Circle(10);
s[1]=&Cylinder(20,100); for(int i=0; i<2; i++){
shapeArea(*s[i]); shapePrint(s[i]); } } 答: 说明:
i=0时,(4)-(1)-(5)-(2)-(1); i=1时,(4)-(3)-(5)-(2)-(3); 从上到下314
依次为: Circle : r=10 area=314
3140
Circle : r=20 area=3140
3、 请阅读程序,根据类型信息和类型转换的原理,按顺序写出程序的运行结果。
(P157,第4(3)题,ex5-4-3.cpp)——不要求! #include
void virtual f(){cout<<\};
class B:public A{ public:
void f(){cout<<\ void fb(){cout<<\};
class C:public A{ public:
void f(){cout<<\
void fc(){cout<<\};
void f(A *p){ p->f();
if (typeid(*p)==typeid(B)) { B *bp=dynamic_cast(p); bp->fb(); }
if (typeid(*p)==typeid(C)){ C *bc=dynamic_cast
void main(){
A *pa; B b; C c;
pa=&b; f(pa); pa=&c; f(pa); } 答:
从上到下f() in class B
依次为: normal function fb
f() in class C
normal function fc
4.6. 第6章 运算符重载(P183~185)
1、 请阅读程序,根据友元函数运算符重载的定义,按顺序写出程序的运行结果。
(P183,第5(1)题,ex6-5-1.cpp) #include
ABC(int x,int y,int z):a(x),b(y),c(z){ }
friend ostream &operator<<(ostream &out,ABC& f); };
ostream &operator<<(ostream &out,ABC& f){
out<<\ return out; }
void main(){
ABC obj(10,20,30); cout< 从上到下a=10 依次为: b=20 c=30 2、 请阅读程序,根据对象赋值及构造的特性,按顺序写出程序的运行结果。 (P184,第5(2)题,ex6-5-2.cpp)——不要求! #include X(char *b){ s=new char[sizeof(b)+1]; strcpy(s,b);