我是继承人的新手,我无法理解其中的一些概念。
我要做的是我有一个名为Rectangle
的类,它创建并绘制一个矩形。我有另一个名为Button
的类,它是一个矩形,上面有文本,并根据是否单击而改变颜色。
我的Rectangle类用于其他领域并且有效。我不确定如何让Button
类以我想要的方式从Rectangle
类继承。
Rectangle.h
#ifndef _rectangle_h_
#define _rectangle_h_
#include <vector>
#include "glut.h"
class Rectangle
{
public:
Rectangle(std::vector<int> p1, std::vector<int> p2, double color[3]);
void Draw() const;
protected:
std::vector<int> mP1;
std::vector<int> mP2;
double mColor[3];
};
#endif
Rectangle.cpp
#include "Rectangle.h"
Rectangle::Rectangle(std::vector<int> p1, std::vector<int> p2, double color[3])
{
mP1 = p1;
mP2 = p2;
mColor[0] = color[0];
mColor[1] = color[1];
mColor[2] = color[2];
}
void Rectangle::Draw() const
{
glColor3d(mColor[0], mColor[1], mColor[2]);
glBegin(GL_QUADS);
glVertex2d(mP1[0], mP1[1]);
glVertex2d(mP2[0], mP1[1]);
glVertex2d(mP2[0], mP2[1]);
glVertex2d(mP1[0], mP2[1]);
glEnd();
}
这是我想要做的,但我不确定正确的语法是什么。 Button
可以使用Rectangle
点(mP1 and mP2
)和颜色(mColor
)。 Button
无法继承Rectangle
的{{1}}方法,因为Draw
也必须绘制文字,但它需要调用Button
的{{1}} 1}}方法以绘制实际的矩形。
我的问题是“我将如何做到这一点?”
同样,下面是我认为实现这一目标的正确方法,但我知道这是不正确的,并且我在问这样做的正确方法是什么。
Button.h
Rectangle
Button.cpp
Draw
答案 0 :(得分:2)
作为初学者,你应该遵守这些规则虔诚地:
virtual
析构函数。virtual
。调用父构造函数的语法如下:
Button::Button (std::vector<int> p1, std::vector<int> p2, std::string text) :
Rectangle (p1, p2, color)
{
// rest of Button constructor
}
您需要将color
定义为Button
的静态成员。
建议为Color和Point定义类,而不是使用裸数组/向量。 {2}点的std::vector
是一种矫枉过正。使用std::array
或class Point {int x, y; ...};
继承是否适合您的情况是值得商榷的。也许如果Button的矩形只用于绘制它,那么继承是不合适的。这样的按钮只是使用矩形来绘制自己。 OTOH如果对象的边界是矩形,并且这些边界用于对象交互,例如对于计算包含其他较小对象的对象,则继承是最合适的。
答案 1 :(得分:0)
您需要在Rectangle中编写一个默认构造函数来创建Button的对象,因为当您尝试创建Button的对象时,它将尝试调用基类构造函数。否则,您需要通过在初始化列表中调用基类构造函数来更改派生类构造函数的构造函数定义。
现在,您将覆盖按钮中的draw()
功能。如果您更喜欢使用多态,要使用基类指针调用函数,您应该定义Rectangle::draw()
应定义为虚函数。
答案 2 :(得分:-1)
Button不能继承Rectangle的Draw方法,因为Button也必须绘制文本,但它确实需要调用Rectangle的Draw 方法以绘制实际的矩形。
如果要调用超类draw方法,请执行Rectangle :: Draw()