(8)对于包含有纯虚函数的类被称为 抽象类 。
二、选择题(至少选一个,可以多选)D. 抽象类指针可以指向不同的派生类
三、判断题(1)抽象类中只能有一个纯虚数。( 错 )
(2)构造函数和析构函数都不能说明为虚基数。 ( 错 )
(3)程序中可以说明抽象类的指针或引用。 ( 对 )
(4)一个类中的虚基数说明不仅对基类中的同名函数有影响,而且对它的派生类中的重定义的函数也有影响。 ( 错 )
(5)在构造函数和析构函数中调用虚函数时,采用动态联编,即它们所调用的虚函数时是在派生类中重定义的虚函数。 ( 错 )
(6)因为没有为纯虚函数定义代码,所以在构造函数和析构函数内均不可调用纯虚函数。 ( 对 )
生类中对虚函数area()和volume()重新定义,分别求球体和圆柱体的体积及表面积。
编写程序如下:
#include
using namespace std;
const double PI=3.14159265;
class circle
{ public:
circle(double r) { radius = r; }
virtual double area() { return 0.0; }
virtual double volume() { return 0.0; }
protected:
double radius;
};
class sphere:public circle
{ public:
sphere( double r ):circle( r ){ }
double area() { return 4.0 * PI * radius * radius; }
double volume()
{ return 4.0 * PI * radius * radius * radius / 3.0; }
};
class column:public circle
{ public:
column( double r,double h ):circle( r ) { height = h; }
double area()
{ return 2.0 * PI * radius * ( height + radius ); }
double volume()
{ return PI * radius * radius * height; }
private:
double height;
};
int main()
{ circle *p;
sphere sobj(2);
p = &sobj;
cout << "球体:" << endl;
cout << "体积 = " << p->volume() << endl;
cout << "表面积 = " << p->area() << endl;
column cobj( 3,5 );
p = &cobj;
cout << "圆柱体:" << endl;
cout << "体积 = " << p->volume() << endl;
cout << "表面积 = " << p->area() << endl;
return 0;
}
程序运行结果如下:
(2)编写一个程序,用于计算正方形、三角形和圆的面积及计算各类形状的总面积。
编写程序如下:
/xt5_2.cpp
#include
#include
using namespace std;
class Shape//定义抽象类Shape
{
public:
Shape();//构造函数,记算图形序号
void show();//输出面积
virtual double area()=0; //纯虚函数,计算面积
virtual string shapename()=0; //纯虚函数,得到显示图形的名称
protected:
string name;
static int count; //记录图形序号
};
Shape::Shape()
{
cout<<"请输入";
count=count+1;
}
void Shape::show()
{
cout<<"第"<area();
delete s[i];
}
return sum;
}
class Triangle:public Shape//定义派生类Triangle
{
public:
Triangle();//构造函数,得到三角形的底和高
double area(){return h*w*0.5;} //纯虚函数的具体实现,计算三角形的面积
string shapename(){name="三角形";return name;}//得到三角形的名称
protected:
double h, w;
};
Triangle::Triangle()
{
double myw,myh;
cout<<"三角形的底和高:";
cin >>myw>>myh;
w=myw;
h=myh;
}
class Rectangle:public Shape//定义派生类Rectangle
{
public:
Rectangle();//构造函数,得到矩形的长和宽
double area(){return l*w;} //纯虚函数的具体实现,计算矩形的面积
string shapename(){name="矩形";return name;} //得到矩形的名称
protected:
double l, w;
};
Rectangle::Rectangle()
{
double myl,myw;
cout<<"矩形的长和宽:";
cin>>myl>>myw;
l=myl;w=myw;
}
class Circle:public Shape//定义派生类Circle
{
public:
Circle();//构造函数,得到圆的半径
double area(){return radius*radius*3.14;}// 实现纯虚函数,计算圆的面积
string shapename(){name="圆";return name;} //得到圆的名称
protected:
double radius;
};
Circle::Circle()
{
double r;
cout<<"圆的半径:";
cin>>r;
radius=r;}
int Shape::count=0;
int main()
{
Shape *s[4];
s[0]=new Triangle();
s[0]->show();
s[1]=new Rectangle();
s[1]->show();
s[2]=new Circle();
s[2]->show();
s[3]=new Circle();
s[3]->show();
double sum=total(s,4);
cout<<"上述图形的面积和为:";
cout<