1. 介绍
在面向对象编程中,继承是一种重要的方式来构建复杂的程序。C++中的继承机制允许一个类从另一个类中继承属性和方法,这些被继承的属性和方法可以在子类中使用或者重写。在本文中,我们将介绍如何通过一个三角形类的继承来实现一个测试程序,并说明继承的概念和使用方法。
2. 三角形类的定义
我们先来定义一个三角形类来作为父类,这个类中包含了三边的长度和计算面积的方法。我们将这个类定义为Triangle类,并在其中增加输入和输出边长的方法:
class Triangle {
public:
double sideA;
double sideB;
double sideC;
double area;
void setSides(double a, double b, double c) {
sideA = a;
sideB = b;
sideC = c;
}
void outputSides() {
std::cout << "Side 1: " << sideA << std::endl;
std::cout << "Side 2: " << sideB << std::endl;
std::cout << "Side 3: " << sideC << std::endl;
}
virtual void calcArea() {
double s = (sideA + sideB + sideC) / 2;
area = sqrt(s*(s-sideA)*(s-sideB)*(s-sideC));
}
};
在上述代码中,我们定义了一个三角形类,其中包含了三个具体的边长和计算面积的方法calcArea()。同时,我们使用了virtual关键字将calcArea()方法定义为虚函数,以便在子类中进行重写。
3. EquilateralTriangle类的定义
接下来,我们通过继承Triangle类来创建一个等边三角形类——EquilateralTriangle类。由于等边三角形有特殊的计算面积方式,因此我们需要重写calcArea()方法:
class EquilateralTriangle : public Triangle {
public:
void calcArea() override {
area = sqrt(3) * sideA * sideA / 4;
}
};
在EquilateralTriangle类中,我们使用public继承了Triangle类,并重写了父类中的calcArea()方法。这里使用了override关键字,表示这个方法是在子类中进行重写的。在这个计算面积的具体实现中,我们使用了等边三角形的计算公式。因为EquilateralTriangle是Triangle的子类,所以可以在EquilateralTriangle类中使用三角形类中的其他属性和方法。
4. RightTriangle类的定义
同样的,我们还可以使用Triangle类来创建一个右三角形类——RightTriangle类。由于右三角形也有特殊的计算面积方式,因此我们同样需要重写calcArea()方法:
class RightTriangle : public Triangle {
public:
void calcArea() override {
area = sideA * sideB / 2;
}
};
在RightTriangle类中,我们同样使用public继承了Triangle类,并重写了父类中的calcArea()方法。这里同样使用了override关键字,表示这个方法是在子类中进行重写的。在这个计算面积的具体实现中,我们使用了右三角形的计算公式。
5. 测试程序的编写
接下来,我们可以编写一个测试程序来测试这些类的功能。在测试程序中,我们需要创建一个Triangle类的指针数组,用于存放各种类型的三角形。我们可以通过输入每个三角形的类型和边长来创建这些三角形,并计算它们的面积。最后,我们将每个三角形的面积输出到屏幕上。
int main() {
const int numTriangles = 3;
Triangle* triangles[numTriangles];
for (int i = 0; i < numTriangles; ++i) {
std::cout << "Enter triangle type (1=Triangle, 2=EquilateralTriangle, 3=RightTriangle): ";
int type;
std::cin >> type;
double a, b, c;
std::cout << "Enter side lengths: ";
std::cin >> a >> b >> c;
if (type == 1) {
triangles[i] = new Triangle();
}
else if (type == 2) {
triangles[i] = new EquilateralTriangle();
}
else if (type == 3) {
triangles[i] = new RightTriangle();
}
triangles[i]->setSides(a, b, c);
triangles[i]->calcArea();
}
for (int i = 0; i < numTriangles; ++i) {
std::cout << "Triangle " << i+1 << " area: " << triangles[i]->area << std::endl;
delete triangles[i];
}
return 0;
}
在上述测试程序中,我们首先定义了一个Triangle类的指针数组triangles,用于存放三角形对象。然后,我们通过一个循环依次输入每个三角形对象的类型和边长,并创建相应的对象。根据输入的类型,我们分别创建Triangle、EquilateralTriangle和RightTriangle类型的对象,并保存在数组中。每个对象的边长使用setSides()方法进行设置,并计算它们的面积。
最后,我们通过另一个循环输出每个三角形的面积,并删除之前动态分配的内存。在输出程序中,我们使用了for循环以及指针访问运算符“->”来访问每个三角形对象的面积属性。
6. 总结
继承是C++面向对象编程中的一个重要机制,通过继承,我们可以创建新的类,同时从已有类中继承属性和方法。在本文中,我们介绍了如何通过继承Triangle类来创建EquilateralTriangle和RightTriangle类,并编写了一个测试程序来测试这些类的功能。通过本文的学习,我们能更好地理解继承的概念和使用方法。同时,我们也能够更好地掌握C++面向对象编程的相关知识,为今后更好地开发高效的C++程序打下坚实的基础。