使用FLTK的C++多重继承问题
C++ multiple inheritance problem using FLTK
我在使用 fltk 绘制基本形状时遇到了问题。
我制作了 2 个 classes'Rectangle' 和 'Circle' 可以正常显示。然后我创建了第三个 class 继承自 'Rectangle' 和 'Circle' 称为 'RectangleAndCircle' :
//declaration in BasicShape.h
class Rectangle: public virtual BasicShape, public virtual Sketchable{
int w,h;
public:
Rectangle(Point center, int width=50, int height=50, Fl_Color fillColor=FL_WHITE, Fl_Color frameColor=FL_BLACK);
void setPoint(Point new_p){center=new_p;}
virtual void draw() const override;
};
class Circle:public virtual BasicShape, public virtual Sketchable{
int r;
public:
Circle(Point center, int rayon=50, Fl_Color fillColor=FL_WHITE, Fl_Color frameColor=FL_BLACK);
virtual void draw() const override;
};
class RectangleAndCircle: public virtual Rectangle, public virtual Circle{
public:
RectangleAndCircle(Point center,int w, int h, int r,
Fl_Color CircFillColor, Fl_Color CircFrameColor,
Fl_Color RectFillColor, Fl_Color RectFrameColor);
void draw() const override;
当我尝试绘制一个 'RectangleAndCircle' 实例时,矩形和圆形共享相同的颜色,即使我设置了矩形颜色也是如此。
这里是 'RectangleAndCircle' 的构造函数代码和图形的绘制:
RectangleAndCircle::RectangleAndCircle(Point center, int w, int h, int r, Fl_Color CircFillColor,
Fl_Color CircFrameColor, Fl_Color RectFillColor, Fl_Color RectFrameColor)
:Rectangle(center,w,h,RectFillColor,RectFrameColor)
, Circle(center,r,CircFillColor,CircFrameColor){}
void Rectangle::draw() const {
fl_begin_polygon();
fl_draw_box(FL_FLAT_BOX, center.x+w/2, center.y+h/2, w, h, fillColor);
fl_draw_box(FL_BORDER_FRAME, center.x+w/2, center.y+h/2, w, h, frameColor);
fl_end_polygon();
}
void Circle::draw() const {
fl_color(fillColor);
fl_begin_polygon();
fl_circle(center.x, center.y, r);
fl_end_polygon();
}
void RectangleAndCircle::draw() const {
Rectangle::draw();
Circle::draw();
}
我在主窗口 class 中创建了一个 'RectangleAndCircle' 的实例,然后绘制它。
RectangleAndCircle r{Point{50,50},50,50,12,FL_RED,FL_BLACK, FL_WHITE, FL_BLACK};
...
r.draw()
我是不是做错了什么?
您正在使用虚拟继承。这意味着在 RectangleAndCircle
中只有 one 个 BasicShape
的实例。此 BasicShape
将由 Rectangle
和 Circle
构造函数设置其 fillColor
,最后调用的构造函数将覆盖该值。
我的建议是不要在这里继承,而是在 RectangleAndCricle
中有两个 Circle
和 Rectangle
类型的字段,然后在 [=19= 中分别调用它们].继承以重用,而不是重用(您可能不想将 RectangleAndCricle
作为 Circle
或 Rectangle
传递)
我在使用 fltk 绘制基本形状时遇到了问题。
我制作了 2 个 classes'Rectangle' 和 'Circle' 可以正常显示。然后我创建了第三个 class 继承自 'Rectangle' 和 'Circle' 称为 'RectangleAndCircle' :
//declaration in BasicShape.h
class Rectangle: public virtual BasicShape, public virtual Sketchable{
int w,h;
public:
Rectangle(Point center, int width=50, int height=50, Fl_Color fillColor=FL_WHITE, Fl_Color frameColor=FL_BLACK);
void setPoint(Point new_p){center=new_p;}
virtual void draw() const override;
};
class Circle:public virtual BasicShape, public virtual Sketchable{
int r;
public:
Circle(Point center, int rayon=50, Fl_Color fillColor=FL_WHITE, Fl_Color frameColor=FL_BLACK);
virtual void draw() const override;
};
class RectangleAndCircle: public virtual Rectangle, public virtual Circle{
public:
RectangleAndCircle(Point center,int w, int h, int r,
Fl_Color CircFillColor, Fl_Color CircFrameColor,
Fl_Color RectFillColor, Fl_Color RectFrameColor);
void draw() const override;
当我尝试绘制一个 'RectangleAndCircle' 实例时,矩形和圆形共享相同的颜色,即使我设置了矩形颜色也是如此。
这里是 'RectangleAndCircle' 的构造函数代码和图形的绘制:
RectangleAndCircle::RectangleAndCircle(Point center, int w, int h, int r, Fl_Color CircFillColor,
Fl_Color CircFrameColor, Fl_Color RectFillColor, Fl_Color RectFrameColor)
:Rectangle(center,w,h,RectFillColor,RectFrameColor)
, Circle(center,r,CircFillColor,CircFrameColor){}
void Rectangle::draw() const {
fl_begin_polygon();
fl_draw_box(FL_FLAT_BOX, center.x+w/2, center.y+h/2, w, h, fillColor);
fl_draw_box(FL_BORDER_FRAME, center.x+w/2, center.y+h/2, w, h, frameColor);
fl_end_polygon();
}
void Circle::draw() const {
fl_color(fillColor);
fl_begin_polygon();
fl_circle(center.x, center.y, r);
fl_end_polygon();
}
void RectangleAndCircle::draw() const {
Rectangle::draw();
Circle::draw();
}
我在主窗口 class 中创建了一个 'RectangleAndCircle' 的实例,然后绘制它。
RectangleAndCircle r{Point{50,50},50,50,12,FL_RED,FL_BLACK, FL_WHITE, FL_BLACK};
...
r.draw()
我是不是做错了什么?
您正在使用虚拟继承。这意味着在 RectangleAndCircle
中只有 one 个 BasicShape
的实例。此 BasicShape
将由 Rectangle
和 Circle
构造函数设置其 fillColor
,最后调用的构造函数将覆盖该值。
我的建议是不要在这里继承,而是在 RectangleAndCricle
中有两个 Circle
和 Rectangle
类型的字段,然后在 [=19= 中分别调用它们].继承以重用,而不是重用(您可能不想将 RectangleAndCricle
作为 Circle
或 Rectangle
传递)