理由:
输出运算符<<的第一个操作数不是当前类的对象,按照C++语言规定,这种情况只能定义为友元运算符重载函数。
12.类B是类A的公有派生类,类A和类B中都定义了虚函数func(),p是一个指向类A对象的指针,则p->A:
:
func()将(A)。
A.调用类A中的函数func()
B.调用类B中的函数func()
C.根据p所指的对象类型而确定调用类A中或类B中的函数func()
D.既调用类A中函数,也调用类B中的函数
理由:
二、问答题:
1.是否使用了虚函数就能实现运行时的多态性?
怎样才能实现运行时的多态性?
答:
不是。
首先要在基类中定义虚函数,并在其派生类中定义重名的虚函数。
派生类一定以公有方式继承了基类。
实现运行时的多态性时,必须使用基类类型的指针变量或引用,使该指针指向该基类的不同派生类的对象,并通过该指针指向虚函数,才能实现动态的多态性。
2.为什么析构函数总是要求说明为虚函数?
答:
在基类中及其派生类中都动态分配内存空间时,必须把析构函数定义为虚函数,实现撤消对象时的多态性。
根据赋值兼容规则可以用基类的指针指向派生类对象,如果由该指针撤销派生类对象,未将析构函数说明为虚函数,则会调用基类的析构函数,使对象释放不完全。
因此必须将析构函数说明为虚函数,实现多态性,自动调用派生类析构函数,使得所定义的派生类对象得到完全的释放。
3.存在这样的抽象类吗?
该类定义中并没有定义纯虚函数。
答:
存在这样的抽象类,该类继承的基类中定义了纯虚函数,而该类定义中没有重新定义纯虚函数,但该类继承了纯虚函数,所以该类也存在纯虚函数,所以也是抽象类。
4.定义虚函数的目的是什么?
定义纯虚函数有什么作用?
答:
定义虚函数的目的是实现动态多态性;作用是定义纯虚函数的目的在于基类给派生类提供一个标准的函数原型,统一接口,为实现动态多态性打下基础,派生类将根据需要给出纯虚函数的具体实现代码。
三、读程序按要求做题
1.以下程序如果将Point类的析构函数定义为虚函数,输出结果是什么?
试分析原因
#include
usingnamespacestd;
classPoint
{
public:
Point(floata,floatb):
x(a),y(b){}
~Point(){cout<<"executingPointdestructor"<private:
floatx;
floaty;
};
classCircle:
publicPoint
{public:
Circle(inta,intb,intr):
Point(a,b),radius(r){}
~Circle(){cout<<"exectingCircledestructor"<private:
floatradius;
};
intmain()
{
Point*p=newCircle(2.5,1.8,4.5);
deletep;
return0;
}
原运行结果为:
executingPointdestructor
Pressanykeytocontinue
修改后运行结果为:
exectingCircledestructor
executingPointdestructor
Pressanykeytocontinue
原因:
指针p是指向派生类的基类指针,在不生命析构函数为虚函数时,编译器实施静态绑定,在删除基类指针时,只调用指针所属的基类的析构函数,而不调用派生类的析构函数,析构不完全,出现最初的运行结果。
而将基类的析构函数声明为虚函数,删除该在指针时,就会实现动态多态性,调用该指针指向的派生类的析构函数,而派生类的析构函数又会自动调用基类的析构函数,使整个对象完全释放,出现修改后的运行结果。
2.找出下面程序运行结果错误的原因(未按++、--运算符的要求做),并改正。
#include
classcoord{
intx,y;
public:
coord(inti=0,intj=0);
voidprint();
friendcoord&operator++(coordop);//
};
coord:
:
coord(inti,intj)
{x=i;y=j;}
voidcoord:
:
print()
{cout<<"x:
"<"<coord&operator++(coordop)//
{++op.x;
++op.y;
returnop;
}
main()
{coordob(10,20);
ob.print();
++ob;//
ob.print();
operator++(ob);//
ob.print();
return0;
}
答:
错误在于++重载函数改变了原来的++应该实现的功能。
因为++运算的实际意义是改变其作用的变量(操作数)的值,所以一定要考虑传递的参数必须被改变(即必须是传地址(指针/引用)),否则就没有实现原来++的功能。
因此,该程序需要修改的语句为:
friendcoord&operator++(coordop);修改为:
friendcoord&operator++(coord&op);
coord&operator++(coordop)//修改为:
coord&operator++(coord&op)
3.读下列程序,按要求做题
#include
classB0
{
public:
voiddisplay(){cout<<"B0:
:
display()"<};
classB1:
publicB0
{public:
voiddisplay(){cout<<"B1:
:
display()"<};
classD1:
publicB1
{
publi