当前位置:首页 > 面向对象程序设计课后习题答案
cin>>eng; }
void print()
{ student::print(); stud::print();
cout<<\ cout<<\
cout<<\ }
void printname()
{ student::printname(); } private:
int math; int eng; };
class teacher:public person { public:
void input()
{ person::input();
cout<<\ cin>>degree;
cout<<\ cin>>dep; }
void print()
{ person::print();
cout<<\
cout<<\ }
void printname()
{ person::printname(); } private:
char degree[l],dep[l]; };
void main() { score c1; teacher t1;
cout<<\ c1.input();
cout<<\ t1.input();
cout<<\ c1.printname(); c1.print();
cout<<\ t1.printname(); t1.print(); }
[5_20] [5_21] (略)
第六章:多态性与虚函数
[6_1]答:所谓联编就是把函数名与函数体的程序代码连接(联系)在一起的过程。静态联编就是在编译阶段完成的联编。编译时的多态是通过静态联编来实现的。静态联编时,系统用实参与形参进行匹配,对于同名的重载函数便根据参数上的差异进行区分,然后进行联编,从而实现了多态性。
[6_2]答:动态联编是运行阶段完成的联编。运行时的多态是用动态联编实现的。即当程序调用到某一函数名时,才去寻找和连接其程序代码,对面向对象程序设计而言,就是当对象接收到某一消息时,才去寻找和连接相应的方法。
[6_3]答:编译时多态性主要是通过函数重载和运算符重载实现的。运行时多态性主要是通过虚函数来实现的。
[6_4]什么是虚函数?虚函数与函数重载有哪些相同与不同点?
虚函数就是在基类中被关键字virtual声明,并在派生类中重定义的函数。虚函数同派生类的结合可使C++支持运行时的多态性。
在一个派生类中重新定义基类的虚函数是函数重载的另一种形式,但它不同于一般的函数重载。普通的函数重载时,其函数的参数或参数类型必须有所不同,函数的返回类型也可以不同。但是,当重载一个虚函数时,页就是说在派生类中重新定义虚函数时,要求函数名、返回类型、参数个数、参数的类型和顺序与基类中的虚函数原型完全相同。如果仅仅返回类型不同,其余均相同,系统会给出错误信息;若仅仅函数名相同,而参数的个数、类型或顺序不同,系统将它作为普通的函数重载,这时将丢失函数的特性。
[6_5]答:纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但要求在它的派生类中必须定义自己的版本,或重新说明为纯虚函数。 纯虚函数的定义形式如下:
virtual 函数类型 函数名(参数表)=0;
如果一个类至少有一个纯虚函数,那么就称该类为抽象类。 [6_6]答:A 说明:C++规定构造函数不能是虚函数
[6_7] 答:D 说明:C++规定派生类中的虚函数的返回类型、参数个数、参数类型必须与虚函数的原型相同。
[6_8]答:C 说明:virtual show()=0;表示show是纯虚函数,但没指定是否带返回值,错误。Virtual show();未表明show是纯虚函数,错误。void show()=0 virtual;把virtual的位置写错了。
正确答案是virtual void show()=0; [6_9]题:不正确
因为虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数与参数类型的顺序,都必须与基类中的原型完全相同,而本程序段中虚函数在派生类中重定义时,参数个数与基类中的原型不相同。 [6_10]题:本程序的运行结果为: Stock class Stock class
Stock class 说明如下:
(1)指向Stock类的对象指针,也可以指向派生类对象。例如本程序中,指向Stock类型的指针ptr可以接受派生类对象f1的起始地址。 (2)语句ptr->print()均执行Stock::print(),而不执行Der1_Stock::print()或Der2_Stock::print(),这是因为基类和派生类定义的print()函数的返回值类型、参数类型和个数均相同,基类中定义的print()未声明成虚类型(virtual),这时的函数调用是在编译时静态联编的。 [6_11]题:将上例基类Stock中的print()函数前面加virtual就行了。 [6_12]题:程序实现如下: #include
double distance; car(double f)
{ distance = f; }
virtual void travel_time()
{ cout<<\ cout< class truck:public car { public: truck(double f):car(f) { } void travel_time() { cout<<\ cout< { car *p,car_time(150.0); truck truck_time(150); p=&car_time; p->travel_time(); p=&truck_time; p->travel_time(); return 0; } [6_13]题:程序如下: #include void set_j(float j) { japan=j; } void set_e(float e) { europe=e; } virtual void print_exchange()=0; protected: float japan,europe; }; class ja:public currency { public: void print_exchange() { cout<<\ cout< class eur:public currency { public: void print_exchange() { cout<<\ eur exchange $: \ cout< { currency *ptr[2]; ja j1; eur e1; ptr[0]=&j1; ptr[0]->set_j(116.30); ptr[0]->print_exchange(); ptr[1]=&e1; ptr[1]->set_e(1.1634); ptr[1]->print_exchange(); return 0; } [6_14]题:程序如下: #include void set_j(float j)
共分享92篇相关文档