gpt4 book ai didi

c++ - 如何向派生类添加功能?

转载 作者:搜寻专家 更新时间:2023-10-31 00:31:53 24 4
gpt4 key购买 nike

我有一个基类 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() 函数是 Circle 类中的一个虚拟 函数。这就是为什么可以在派生类中覆盖它。

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

最佳答案

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
}

关于c++ - 如何向派生类添加功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32808420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com