C++基于FLTK多继承实现复合图形时颜色显示异常问题
问题核心原因
你这里的错误是虚继承导致的虚基类成员只有唯一副本,被后执行的构造函数覆盖了属性值:
- 你的
Rectangle和Circle都虚继承自BasicShape,这意味着所有派生类中只会保留一份BasicShape的成员实例,你放在BasicShape里的fillColor、frameColor两个属性是所有父类共享的。 - 你在
RectangleAndCircle的构造函数初始化列表里,先调用Rectangle构造函数把共享的fillColor设为你传入的RectFillColor(白色),后调用Circle构造函数又把同一份fillColor覆盖成了CircFillColor(红色),最终两个draw方法读取的都是最后被覆盖的红色值。
另外存在一个细节隐患:Circle的draw方法主动调用了fl_color(fillColor)设置全局绘制颜色,而Rectangle的draw依赖fl_draw_box传入的颜色参数,该逻辑本身不会触发本次问题,但后续绘制其他图形时如果没有主动重置颜色可能会出现异常。
修复方案
推荐两种可行的修改方式:
- 改用组合替代多继承(更合理的设计)
该场景本身不适合用多继承,你可以把RectangleAndCircle改为持有独立的Rectangle和Circle成员变量,各自保存自己的属性,互不干扰:
class RectangleAndCircle: public virtual BasicShape, public virtual Sketchable{ private: Rectangle rect; Circle circ; public: RectangleAndCircle(Point center,int w, int h, int r, Fl_Color CircFillColor, Fl_Color CircFrameColor, Fl_Color RectFillColor, Fl_Color RectFrameColor) :rect(center, w, h, RectFillColor, RectFrameColor), circ(center, r, CircFillColor, CircFrameColor){} void draw() const override{ rect.draw(); circ.draw(); } };
- 拆分颜色属性,不放在虚基类中
如果你一定要保留多继承结构,就把fillColor和frameColor从BasicShape里移出去,分别作为Rectangle和Circle的普通成员变量,这样两个父类的颜色属性独立存储,不会互相覆盖。
内容的提问来源于stack exchange,提问作者Alex Vinovrski
相关产品推荐
相关产品推荐

