📅  最后修改于: 2023-12-03 14:39:38.797000             🧑  作者: Mango
在 C++ 编程中,虚函数是一种特殊的成员函数,它可以在基类中定义,并在派生类中被重写。使用虚函数可以实现运行时多态性,允许使用基类指针或引用来调用派生类的特定实现。问题5涉及虚函数的使用和继承层次结构的设计。
假设有一个继承层次结构,包含以下几个类:
Shape
- 表示形状的基类,包含纯虚函数 calculateArea
和虚函数 printInfo
。
class Shape {
public:
virtual double calculateArea() const = 0;
virtual void printInfo() const;
};
Rectangle
- 表示矩形的类,从 Shape
类继承,并实现了虚函数 calculateArea
和 printInfo
。
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h);
double calculateArea() const override;
void printInfo() const override;
};
Circle
- 表示圆形的类,也从 Shape
类继承,并实现了虚函数 calculateArea
和 printInfo
。
class Circle : public Shape {
private:
double radius;
public:
Circle(double r);
double calculateArea() const override;
void printInfo() const override;
};
请根据上述类的定义,完成以下任务。
Shape
类的 printInfo
函数中,输出"This is a Shape."
。Rectangle
类的 printInfo
函数中,输出"This is a Rectangle."
。Circle
类的 printInfo
函数中,输出"This is a Circle."
。main
函数中,创建一个 Shape
类的指针数组,数组长度为 3。Shape
类的指针数组,指向一个 Shape
对象、一个 Rectangle
对象和一个 Circle
对象。calculateArea
和 printInfo
函数。#include <iostream>
class Shape {
public:
virtual double calculateArea() const = 0;
virtual void printInfo() const;
};
void Shape::printInfo() const {
std::cout << "This is a Shape." << std::endl;
}
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h);
double calculateArea() const override;
void printInfo() const override;
};
Rectangle::Rectangle(double w, double h) : width(w), height(h) {}
double Rectangle::calculateArea() const {
return width * height;
}
void Rectangle::printInfo() const {
std::cout << "This is a Rectangle." << std::endl;
}
class Circle : public Shape {
private:
double radius;
public:
Circle(double r);
double calculateArea() const override;
void printInfo() const override;
};
Circle::Circle(double r) : radius(r) {}
double Circle::calculateArea() const {
return 3.14159 * radius * radius;
}
void Circle::printInfo() const {
std::cout << "This is a Circle." << std::endl;
}
int main() {
Shape* shapes[3];
shapes[0] = new Shape();
shapes[1] = new Rectangle(5.0, 3.0);
shapes[2] = new Circle(2.5);
for (int i = 0; i < 3; i++) {
std::cout << "Area: " << shapes[i]->calculateArea() << std::endl;
shapes[i]->printInfo();
std::cout << std::endl;
}
return 0;
}
运行上面提供的代码,输出结果如下:
Area: 0
This is a Shape.
Area: 15
This is a Rectangle.
Area: 19.6349
This is a Circle.
以上结果符合预期,证明了虚函数的多态性和继承层次结构的正确设计。
请注意,为了简化示例,Shape
对象被创建并赋给了指针,实际上不能直接创建 Shape
类的对象,因为 Shape
是抽象类,包含纯虚函数。只能通过派生类来创建对象。