我有一个主要cpp文件有
的示例程序 Rectangle rect(5, 5);
Triangle tri(5, 5);
Shape *rectangle1 = ▭
Shape *triangle1 = &tri;
rectangle1->setValues(3, 3);
triangle1->setValues(3, 3);
int area = rectangle1->getArea();
std::cout << area << std::endl;
area = triangle1->getArea();
std::cout << area << std::endl;
std::cin.get();
return 0;
}
矩形,三角形和形状的头文件如下:
Rectangle.h
#ifndef RECTANGLE_H
#define RECTANGLE_H
#include "Shape.h"
class Rectangle: public Shape {
public :
int length;
int width;
Rectangle(int length, int width);
int getArea();
//Rectangle::~Rectangle(void);
};
#endif
Triangle.h
#ifndef TRIANGLE_H
#define TRIANGLE_H
#include "Shape.h"
class Triangle: public Shape {
public :
int length;
int width;
Triangle(int length, int width);
int getArea();
//Triangle::~Triangle(void);
};
#endif
Shape.h
#ifndef STDAFX_H
#define STDAFX_H
#ifndef SHAPE_H
#define SHAPE_H
#include <iostream>
class Shape
{
protected:
int width;
int length;
public:
Shape(int length, int width);
void setValues(int length, int width);
virtual int getArea() = 0;
};
#endif
#endif
形状,矩形和三角形的cpp文件如下:
Rectangle.cpp
#include "stdafx.h"
#include "Rectangle.h"
Rectangle::Rectangle(int length, int width): length(length), width(width), Shape(length, width)
{
}
int Rectangle::getArea() {
return length * width;
}
Triangle.cpp
#include "stdafx.h"
#include "Triangle.h"
Triangle::Triangle(int length, int width): length(length), width(width), Shape(length, width)
{
}
int Triangle::getArea()
{
return length/2 * width;
}
Shape.cpp
#include "stdafx.h"
#include "Shape.h"
#include <iostream>
Shape::Shape(int length, int width): length(length), width(width) {
}
void Shape::setValues(int length, int width) {
this->length = length;
this->width = width;
}
我的思路是因为三角形和矩形从Shape继承,我将rectangle1设置为指向矩形对象而triangle1指向三角形对象,一旦使用默认构造函数值创建了2个形状,我调用setValue ()(对于从Shape继承的所有对象都可以使用。这应该将每个形状的长度和宽度值更改为3,3,当我为每个形状实例运行getArea时,矩形应该返回3 * 3并且三角形应返回3 * 1.5。但是,它们都会在我调用setValues(25和10)之前返回原始区域。
我是否对我的指针或头文件一无所知?
谢谢!
答案 0 :(得分:1)
问题是您在子类中有单独的width
和length
成员变量。因此子类中的getArea
函数将使用这些变量而不是基类中的变量。
答案 1 :(得分:1)
问题是在Shape中你有widht和height,但也有Rectangle类和Triangle类。这意味着在Triangle的每个实例中,你有2个变量Width和height(Shape :: width和Triangle :: width),因为你的函数setValues是形状的,它将修改shape类中的变量,getArea是在矩形类,因此它将使用Rectangle中的变量
解决方案是在Rectangle和Triangle中删除这些重复变量。
答案 2 :(得分:1)
您的Triangle
和Rectangle
形状定义了自己的length
和width
值,隐藏了Shape
的{{1}}和{{ 1}}。但length
并未意识到这一点 - 当您使用width
时,它会设置基类的变量。但是您的Shape
将使用子类值。