如何向派生类添加功能?

时间:2015-09-27 13:29:35

标签: c++ oop inheritance

我有一个基类Circle(简单地绘制圆圈)和两个派生的类SmileyFrowny,添加了两个独特的功能,分别是“嘴表达“”眼睛“。这两个类添加了新功能,覆盖了函数draw_lines() 1 ,其原始位于Circle

// class Smiley
class Smiley: public Circle{
public:
   Smiley(Point c, int rr)  : Circle(c,rr), r(rr) { }
   void draw_lines() const;
private:
   int r;
};

void Smiley::draw_lines() const{
    if (color().visibility())
    // add the mouth
        fl_arc(point(0).x + r/2, point(0).y + r/2, r, r, 180, 360);
    // add the eyes
        fl_arc(point(0).x + r/2, point(0).y + r/4, r/2, r/2, 0, 360);
        fl_arc(point(0).x + 3/2 * r, point(0).y + r/4, r/2, r/2, 0, 360);
    // the below is the body of the original function in Circle
    if (color().visibility())
        fl_arc(point(0).x,point(0).y,r+r,r+r,0,360);
}
// class Frowney
class Frowny: public Circle{
public:
    Frowny(Point c, int rr)  : Circle(c,rr), r(rr) { }
    void draw_lines() const;
private:
    int r;
};

void Frowny::draw_lines() const{
    if (color().visibility())
    // add the mouth
        fl_arc(point(0).x + r/2, point(0).y + r, r, r, 0, 180);
    // add the eyes
        fl_line(point(0).x + r/2 - 5, point(0).y + r/2, point(0).x + r,  point(0).y + r/4);
        fl_line(point(0).x + r + 5, point(0).y + r/4, point(0).x + 1.5*r, point(0).y + r/2);
    if (color().visibility())
        fl_arc(point(0).x,point(0).y,r+r,r+r,0,360);
}

现在,应该从类SmileyFrowny派生两个新类,为每个类添加特定的单独功能。

// class SmileHat
class SmileHat: public Smiley{
public:
    SmileHat(Point c, int rr) : Smiley(c, rr), r(rr), center(c) { }
    void draw_line() const;
private:
    int r;
    Point center;
};

同样适用于Frowny,只有帽子的形状不同。

问题:

为每个班级SmileyFrawney添加新功能的标准做法是:

1.取消现有的(继承的)函数draw_lines()(再次)并包含新功能?

void SmileHat::draw_line() const{
    if (color().visibility())
    // add triangle hat
        fl_line(center.x - r, center.y + r/2, center.x , center.y + r);
        fl_line(center.x + r, center.y + r/2, center.x, center.y + r);
    // body of the function override  in Smiley
     if (color().visibility())
    // add the mouth
        fl_arc(point(0).x + r/2, point(0).y + r/2, r, r, 180, 360);
    // add the eyes
        fl_arc(point(0).x + r/2, point(0).y + r/4, r/2, r/2, 0, 360);
        fl_arc(point(0).x + 3/2 * r, point(0).y + r/4, r/2, r/2, 0, 360);
    // the below is the body of the original function in Circle
    if (color().visibility())
        fl_arc(point(0).x,point(0).y,r+r,r+r,0,360);
}

2.为添加新功能的新类创建一个新的成员函数?

void add_hat() const{
    // draw hat
}

3.还有其他更有效的方法吗?

注意:

我正在考虑实现继承的概念,我似乎没有使用它,通过连续/重复地覆盖相同的函数并扩展它,即在每个派生类中是一个来自基类的代码的显式副本,只有一小部分。

1。函数draw_line()是类virtual中的Circle函数。这就是为什么可以覆盖派生类的原因。

可以找到所有用于编译的附加文件:here。可以找到 FLTK here

2 个答案:

答案 0 :(得分:4)

draw_lines()方法应该声明为虚拟:

virtual void Smiley::draw_lines() const {
    //draw smiley implementation here
}

覆盖draw_lines()并调用基本方法来绘制笑脸:

virtual void SmileHat::draw_lines() const{
    Smiley::draw_lines(); //call base method to draw smiley
    //do the hat drawing here        
}

答案 1 :(得分:1)

要扩展课程并添加新功能,可以:

1.Override现有(继承)函数(在派生类中),添加代表新功能的新代码。就我而言:

void SmileHat::draw_line() const{
    // existing old code
    Smiley::draw_line();
    // newly added feature 
    if (color().visibility())
    // add triangle hat
    fl_line(center.x - r, center.y + r/2, center.x , center.y + r);
    fl_line(center.x + r, center.y + r/2, center.x, center.y + r);
}

2.定义包含要扩展的基本功能装饰器类,然后从中派生不同的类,每个类都为基本功能添加特定的扩展。在我的例子中,类层次结构看起来像:

                                     class Circle
                                          |
                                          |
                      - - - -> class CircleDecorator <- - - -  
                     |            |            |             |
                     |            |            |             |    
             class withSmile class withHat1 class withHat2 class withFrown