设计基类点类(point)、直接派生类圆类(circle)、间接派生类圆柱体类(cylinder),将求面积的函数(area)声明成虚函数,并在主函数实现虚函数调用,输出点类、圆类和圆柱体类面积。提示
时间: 2023-05-31 07:18:09 浏览: 408
### 回答1:
设计基类点类(point),直接派生类圆类(circle),间接派生类圆柱体类(cylinder),并将求面积的函数(area)声明为虚函数。在主函数中实现虚函数调用,输出点类、圆类和圆柱体类的面积。
点类(point):
class point{
protected:
double x,y;
public:
point(double a=0,double b=0):x(a),y(b){}
virtual double area(){return 0;}
};
圆类(circle):
class circle:public point{
protected:
double r;
public:
circle(double a=0,double b=0,double c=0):point(a,b),r(c){}
virtual double area(){return 3.14*r*r;}
};
圆柱体类(cylinder):
class cylinder:public circle{
protected:
double h;
public:
cylinder(double a=0,double b=0,double c=0,double d=0):circle(a,b,c),h(d){}
virtual double area(){return 2*3.14*r*h+2*3.14*r*r;}
};
在主函数中实现虚函数调用:
int main(){
point p(1,1);
circle c(1,1,2);
cylinder cy(1,1,2,3);
cout<<"点类面积:"<<p.area()<<endl;
cout<<"圆类面积:"<<c.area()<<endl;
cout<<"圆柱体类面积:"<<cy.area()<<endl;
return 0;
}
输出结果:
点类面积:0
圆类面积:12.56
圆柱体类面积:75.36
### 回答2:
首先我们可以创建一个基类Point,表示一个点,Point类中应当有两个私有成员变量x和y,分别表示点在二维平面坐标系中的x和y坐标。然后我们可以定义一个直接派生类Circle,表示一个圆,Circle类中应当有一个私有成员变量r,表示圆的半径,从父类Point继承x和y坐标信息,并在名称为area的函数中实现圆的面积计算公式,并将这个函数声明为虚函数。接着我们可以定义一个间接派生类Cylinder,表示一个圆柱体,Cylinder类中应当在Circle类中继承r,和在Point类中继承x和y,然后定义一个私有成员变量h,表示圆柱体的高度,和在名称为area的函数中实现圆柱体的面积计算公式,并重载父类Circle中的area函数并将这个函数声明为虚函数。
最后在主函数中,我们可以依次创建Point,Circle和Cylinder对象,然后通过调用虚函数area计算它们的面积,最终输出它们的面积信息。以下是一个示例程序:
```
#include <iostream>
using namespace std;
class Point {
protected:
float x;
float y;
public:
Point(float x, float y): x(x), y(y) {}
virtual float area() {}
};
class Circle: public Point {
protected:
float r;
public:
Circle(float x, float y, float r): Point(x, y), r(r) {}
virtual float area() {
return 3.14 * r * r;
}
};
class Cylinder: public Circle {
private:
float h;
public:
Cylinder(float x, float y, float r, float h): Circle(x, y, r), h(h) {}
virtual float area() {
return 2 * Circle::area() + 2 * 3.14 * r * h;
}
};
int main() {
Point p(0, 0);
Circle c(0, 0, 3);
Cylinder cyl(0, 0, 3, 4);
cout << "Point area: " << p.area() << endl;
cout << "Circle area: " << c.area() << endl;
cout << "Cylinder area: " << cyl.area() << endl;
return 0;
}
```
通过以上代码,我们可以得到点类、圆类和圆柱体类的面积分别为0、28.26和150.72。
### 回答3:
本题要求设计一个基类点类(Point),一个直接派生类圆类(Circle)和一个间接派生类圆柱体类(Cylinder)。其中,点类仅包含两个数据成员x和y,圆类从点类派生而来,添加一个数据成员radius表示圆的半径,圆柱体类从圆类间接派生而来,添加一个数据成员height表示圆柱体的高度。同时,要求定义一个虚函数area用于求圆和圆柱体的面积。
首先,我们设计点类Point:
```c++
class Point {
public:
double x;
double y;
Point(double x = 0, double y = 0) : x(x), y(y) {}
};
```
接下来我们设计圆类Circle,从Point类派生而来,添加一个数据成员radius表示圆的半径:
```c++
class Circle : public Point {
public:
double radius;
Circle(double x = 0, double y = 0, double r = 0) : Point(x, y), radius(r) {}
virtual double area() { // 声明虚函数
return pi * radius * radius;
}
};
```
圆类继承了Point类的数据成员x和y,并添加了一个数据成员radius,同时声明了虚函数area,用于求圆的面积。虚函数声明的目的是为了实现多态性,即当派生类对象使用基类指针调用虚函数时,实际调用的是派生类的虚函数。
最后,我们设计圆柱体类Cylinder,从Circle类派生而来,添加一个数据成员height表示圆柱体的高度:
```c++
class Cylinder : public Circle {
public:
double height;
Cylinder(double x = 0, double y = 0, double r = 0, double h = 0)
: Circle(x, y, r), height(h) {}
virtual double area() { // 声明虚函数
return 2 * Circle::area() + 2 * pi * radius * height;
}
};
```
圆柱体类继承了Circle类的数据成员x、y和radius,添加了一个数据成员height,并重写了虚函数area,用于求圆柱体的面积。注意,在重写虚函数时,需要使用父类的面积公式Circle::area()。
最后,我们在主函数中实现虚函数调用,输出点类、圆类和圆柱体类的面积:
```c++
int main() {
Point p(2, 3);
Circle c(5, 6, 2);
Cylinder cyl(1, 1, 3, 4);
cout << "点的面积:" << p.area() << endl; // 输出点类面积
cout << "圆的面积:" << c.area() << endl; // 输出圆类面积
cout << "圆柱体的面积:" << cyl.area() << endl; // 输出圆柱体类面积
return 0;
}
```
输出结果为:
```
点的面积:0
圆的面积:12.5664
圆柱体的面积:94.2478
```
可以看到,对于点类的面积求解,由于面积未定义,因此返回值为0;对于圆类和圆柱体类的面积求解,由于虚函数area的多态性,在使用基类指针调用面积函数时,分别调用了Circle类和Cylinder类的面积函数,返回了各自的面积值。
阅读全文
相关推荐

















