C++程序来测试通过三角形类的继承

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++程序打下坚实的基础。

后端开发标签