问答题 使用VC6打开 下的源程序文件modi1.cpp,该程序运行时有错误,请改正其中的错误,使程序正确运行。并且使程序输出的结果为:
OK
注意:错误的语句在//******error******的下面,修改该语句即可。
#include<iostream.h>
class CBase
{
public:
CBase()
{
a=b=0;
}
private:
int a,b;
};
class CDerive1: public CBase
{
public:
CDerive1()
{
}
//******error******
virtual void func();
};
class CDerive2: public CDerive1
{
public:
CDerive2()
{
a=0;
b=0;
}
void func()
{
//******error******
cout < < "OK"<endl;
}
private:
int a;
int b;
};
void main()
{
CDerive2 obj;
//******error******
CDerive1 *p=(CDerive1*)
obj;
p->func();
}
【正确答案】
【答案解析】(1)virtual void func()=0;
(2)cout<< < endl;
(3)CDerive1 *P=(CDerive1*) &obj;
答案考生文件夹 [解析] 程序中定义了类CBase、CDerive1和CDerive2,类CDerive1公有派生于类CBase,CDerive2公有派生于类CDerive1,在类CDerive1中定义了虚函数func(),但是没有给出具体实现,派生类CDerive2中给出了func()函数的具体实现,因此CDerive1类中的func()函数是纯虚函数。
(1)由审题分析可知,CDerive1类中的func()函数是纯虚函数,纯虚函数的定义格式为:virtual<函数类型><函数名>(<参数表>)=0,因此第1个标识下应为“virtual void func()=0;”。func()函数没有参数表。
(2)编译程序后发现第2个标识下有错误,cout流中的数据是用流插入运算符“ < < ”顺序加入的,因此“<”不正确,应改成“cout < < ”OK” < < endl;”。
(3)函数的调用方式有2种:非多态调用和多态调用,非多态调用是指不使用指针或引用的直接调用,多态调用是指通过对象的指针或引用的调用,在主函数中定义了CDerive1 *p,P是指向基类CDerive1的指针,因此是多态调用方式,即通过对象的指针来调用,应该把派生类对象的地址赋给p,而不是对象名,因此第3个标识下应改为“CDerive1 *p=(CDerive1*)&obj;”。