第六章书面作业参考答案
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字,全部文档内容请下载后查看。喜欢就下载吧 ……- 基于PLC控制的航空电镀生产线自动输送
- 中考预测课内外文言文对比阅读2
- 2018-2023年中国商业智能(BI)产业市场
- 中国金融体制改革研究2011new
- 外窗淋水试验方案
- 精益生产(Lean Production)
- 学校安全事故处置和信息报送制度
- Chapter 5 Human Resources Management
- 【小学数学】人教版小学六年级上册数学
- 初中数学解题方法与技巧
- 山东省创伤中心建设与管理指导原则(试
- 函数与数列的极限的强化练习题答案
- 10分钟淋巴按摩消脂
- 网络应急演练预案
- 服装设计入门基础知识
- 初二数学分式计算题练习
- (人教新课标)高二数学必修5第二章 数列
- 最新自主创业项目
- 北京大学 无机化学课件 4第4章 配合物
- 贸易公司业务管理制度




