教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 范文大全 > 资料大全 >

第六章书面作业参考答案

来源:网络收集 时间:2026-08-29
导读: 1 在C++ 中多态性体现在哪几方面? 答案: 在C++中,多态性体现在两个方面: 编译多态性 —— 对同一消息的不同操作是在程序编译时就确定了,即静态多态性。 运行多态性 —— 对同一消息的不同操作是在程序运行时根据不同的运行状况才确定,即动 态多态性。

1 在C++ 中多态性体现在哪几方面?

答案:

在C++中,多态性体现在两个方面:

编译多态性 —— 对同一消息的不同操作是在程序编译时就确定了,即静态多态性。

运行多态性 —— 对同一消息的不同操作是在程序运行时根据不同的运行状况才确定,即动

态多态性。

2 函数重载与虚函数有哪些相同点与不同点?

答案:

函数重载与虚函数之间的相同点是多个函数版本具有相同的函数名,即表现出对同一消息的不同操作。而二者之间的不同点表现在:

⑴ 函数重载的不同函数版本既允许存在于同一类中,也允许基类的成员函数在派生类中重 载。存在于同一类中的不同重载函数版本的参数(类型、个数、顺序)必须有所不同。如果存在于基类和派生类中的成员函数的原型完全一致,则派生类的成员函数将覆盖基类的同名函数。

⑵ 虚函数是用来表现基类和公有派生类的相同原型成员函数之间的关联关系的实现机制, 因此这种同原型成员函数必须分属于基类和派生类,并且首先在基类中用关键字 virtual声明虚函数;一个虚函数一旦被定义,就可以在该基类的一个或多个直接或间接派生类中被重新定义;虚函数重新定义时,其函数原型,即包括返回类型、函数名、参数的类型、个数和顺序,都必须与基类中的原型完全一致。

3 虚函数是如何实现面向对象系统的多态性的,它会带来什么益处?

答案:

在一个具有公有派生关系的类层次结构中,只要在基类中将某个接口函数声明为虚函数,并在该基类的直接和间接公有派生类中重新定义该虚函数的不同新版本,就可以实现在程序运行期间,使用一个基类指针动态地指向基类和从该基类直接或间接派生的任何类的对象,并通过该指针调用虚函数在不同类中定义的不同版本,即动态多态性。显然,虚函数为面向对象系统提供了一种更为灵活的多态性,这种多态能力对于期望在基类中为从该基类派生的所有类定义统一的操作接口的设计尤为重要。

4 下面有两段程序,判断它们是否正确,若有错误,给予纠正。

① class base

{

// …

public:

virtual void show();

};

class derive : public base

{

// …

public:

void show();

};

main() { base obj1, obj2, *ptr1; derive obj3, obj4, *ptr2; ptr1 = &obj1; ptr1->show(); ptr1 = &obj3; ptr1->show(); ptr2 = &obj4; ptr2->show(); ptr2 = &obj2; ptr2->show(); // … } class fruit { // … public: virtual void show() = 0; // … }; class apple : public fruit

{

// …

public:

void show();

// …

};

main()

{

fruit fru, *ptr;

apple app;

ptr = &app;

ptr->show();

ptr = &fru;

ptr->show();

// …

}

答案:

① 该程序的main()中出现了使用派生类指针指向基类对象,并通过该指针调用基类虚函

数的错误语句(ptr2 = &obj2; ptr2->show();),因此,应该将main()修改为:

main()

② { } base obj1, obj2, *ptr1; derive obj3, obj4, *ptr2; ptr1 = &obj1; ptr1->show(); ptr1 = &obj3; ptr1->show(); ptr2 = &obj4; 或ptr1 = &obj4; ptr2->show(); 或ptr1->show(); // …

5 判断下列各段程序是否可以通过编译?为什么?

#include <iomanip.h>

class X

{

public:

X() { }

virtual void foo();

};

class Y : public X

{

public:

Y() { }

void foo() { cout << “Y’s foo invoked” << endl; }

};

int main() { return 0; }

答案:

由于基类中的虚函数没有定义实现代码,所以不能通过编译。修改方法有两种: ① 为基类X中的虚成员函数增加空函数定义体:virtual void foo() {}

或者 该程序的main()中出现了为抽象类fruit创建对象,并通过基类指针调用纯虚函数的错 误语句(fruit fru, ptr = &fru; ptr->show();),因此,应该将main()修改为: main() { fruit *ptr; apple app; ptr = &app; ptr->show(); // … }

② 将基类X中的虚成员函数修改为纯虚函数:virtual void foo() = 0;

#include <iomanip.h>

class X

{

public:

X() { }

virtual void foo() = 0;

};

class Y : public X

{

public:

Y() { }

};

int main() { Y yobj; return 0; }

答案:

由于在派生类Y中没有为基类X的纯虚函数foo重新定义函数体,导致派生类Y仍然是抽象类,因此在main()中不能为Y创建对象yobj,所以该程序无法编译通过。修改方法有两种:

① 在派生类Y中增加虚函数foo的定义:void foo() {}

或者

② 将main()修改为:int main() { return 0; }

#include <iomanip.h>

class X

{

public:

X() { }

virtual void foo() = 0;

};

class Y : public X

{

public:

Y() { }

void foo() { cout << “Y’s foo invoked” << endl; }

};

int main() { Y yobj; return 0; }

答案:

该程序可以编译通过。

…… 此处隐藏:866字,全部文档内容请下载后查看。喜欢就下载吧 ……
第六章书面作业参考答案.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/fanwen/2193017.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)