1. 实现Point类,由Point类派生出Circle类,有Circle类派生出Cylinder类。Point类成员:类型名,横纵坐标;Circle类成员:半径;Cylinder类:高度。 2. 为每个类分别定义构造函数,每个类至少有两个构造函数的重载。 3. 为每个类实现虚析构函数,函数中输出字符串,指明那个类型的对象被析构。 4. 为每个类重载“<<”运算符,实现输出对象中的所有数据成员的值,且输出格式化。 5. 为每个类实现虚函数PrintName(),输出类的名字。 6. Main函数中定义每个类型的对象,并输出对象。定义一个Point类的指针变量,指针变量先后指向不同对象,指向后调用PrintName()输出对象的类型名字。
时间: 2024-02-28 09:55:05 浏览: 76
好的,我会按照您的要求逐一回答您的问题。
首先,我会为您实现一个Point类,并派生出Circle类和Cylinder类。
```cpp
#include <iostream>
#include <iomanip>
using namespace std;
class Point {
protected:
string typeName;
double x, y;
public:
Point() : typeName("Point"), x(0), y(0) {}
Point(double _x, double _y) : typeName("Point"), x(_x), y(_y) {}
virtual ~Point() { cout << typeName << " object is destroyed." << endl; }
friend ostream& operator<<(ostream& out, const Point& p) {
out << "Type: " << p.typeName << endl;
out << fixed << setprecision(2) << "Coordinates: (" << p.x << ", " << p.y << ")" << endl;
return out;
}
virtual void PrintName() const { cout << "Type name: " << typeName << endl; }
};
class Circle : public Point {
protected:
double radius;
public:
Circle() : Point(), radius(0) { typeName = "Circle"; }
Circle(double _x, double _y, double r) : Point(_x, _y), radius(r) { typeName = "Circle"; }
~Circle() { cout << typeName << " object is destroyed." << endl; }
friend ostream& operator<<(ostream& out, const Circle& c) {
out << static_cast<const Point&>(c);
out << fixed << setprecision(2) << "Radius: " << c.radius << endl;
return out;
}
virtual void PrintName() const { cout << "Type name: " << typeName << endl; }
};
class Cylinder : public Circle {
protected:
double height;
public:
Cylinder() : Circle(), height(0) { typeName = "Cylinder"; }
Cylinder(double _x, double _y, double r, double h) : Circle(_x, _y, r), height(h) { typeName = "Cylinder"; }
~Cylinder() { cout << typeName << " object is destroyed." << endl; }
friend ostream& operator<<(ostream& out, const Cylinder& cy) {
out << static_cast<const Circle&>(cy);
out << fixed << setprecision(2) << "Height: " << cy.height << endl;
return out;
}
virtual void PrintName() const { cout << "Type name: " << typeName << endl; }
};
```
上述代码中,Point类包括类型名、横纵坐标,Circle类包括半径,Cylinder类包括高度。每个类至少有两个构造函数的重载,每个类实现虚析构函数并输出对象类型,重载了`<<`运算符,实现输出对象中的所有数据成员的值,且输出格式化,实现了虚函数PrintName(),输出类的名字。
接下来,我会在main函数中定义每个类型的对象,并输出对象。同时,定义一个Point类的指针变量,指针变量先后指向不同对象,指向后调用PrintName()输出对象的类型名字。
```cpp
int main() {
Point p1(1.0, 2.0);
Circle c1(3.0, 4.0, 5.0);
Cylinder cy1(6.0, 7.0, 8.0, 9.0);
cout << p1 << endl;
cout << c1 << endl;
cout << cy1 << endl;
Point* ptr = &p1;
ptr->PrintName();
ptr = &c1;
ptr->PrintName();
ptr = &cy1;
ptr->PrintName();
return 0;
}
```
上述代码中,定义了一个Point对象p1、一个Circle对象c1和一个Cylinder对象cy1,并分别输出了它们的内容。接下来,定义一个Point类的指针变量ptr,分别指向p1、c1和cy1,调用PrintName()输出对象的类型名字。
希望我的回答能够满足您的要求,有其他问题可以随时问我哦!
阅读全文