类的继承例⼦:
以上个动态银河系的制作为例,假设我们定义了⼀个星星的类如下:
class Star{
public: Star(){} ~Star(){}
void Init(); void Move();
protected:
void Draw(); void NewPos(); void Remove();
double m_x = 0; int m_y;
double m_step; int m_color; };
void Star::Init() {
if (m_x == 0) {
m_x = rand() % SCREEN_WIDTH; } else {
m_x = 0; }
m_y = rand() % SCREEN_HEIGHT; m_step = (rand() % 5000) / 1000.0 + 1;
m_color = (int)(m_step * 255 / 6.0 + 0.5); // 速度越快,颜⾊越亮 m_color = RGB(m_color, m_color, m_color); }
void Star::Move() {
Remove();
NewPos();
Draw(); }
void Star::Draw() {
putpixel((int)m_x, m_y, m_color); }
void Star::NewPos() {
m_x += m_step;
if (m_x > SCREEN_WIDTH) this->Init(); }
void Star::Remove() {
putpixel((int)m_x, m_y, 0); }
接下来我们被要求制作⼀个矩形的星星我们该怎么做,其实矩形星星和上述的差别就在于draw()和Romove()这两个函数,所以我们可以利⽤类继承的⽅法来实现,再使⽤同函数名覆盖的⽅法来写类,有三种继承的⽅式如下表所⽰:
派⽣⽅式private派⽣protected派⽣public派⽣
基类的public成员变为private成员变为protected成员仍为public成员
基类的protected成员变为private成员变为private成员仍为protected成员
基类的private成员
不可见不可见不可见
派⽣⽅式引起的访问属性变化概括
基类中的⾮私有成员都成为
派⽣类中的私有成员基类中的⾮私有成员在派⽣类中的访问属性都降⼀级基类中的⾮私有成员在派⽣
public派⽣仍为public成员仍为protected成员不可见
基类中的⾮私有成员在派⽣类中的访问属性保持不变
所以在这⾥我们采⽤public继承的⽅式,只是把其中的类⽅法改变即可(这⾥我们注意在基类中数据并不是private类型,因为若是private类不管⼦类是什么⽅式继承都是不可以调⽤的就算是使⽤同名函数进⾏重载):
class RectStar : public Star {
public:
RectStar(){} ~RectStar(){}
void Move() {
Remove(); NewPos(); Draw(); }
protected:
void Draw(); void Remove(); };
void RectStar::Draw() {
setfillcolor(m_color);
fillrectangle(m_x, m_y, m_x + 3, m_y + 3); }
void RectStar::Remove() {
clearrectangle(m_x, m_y, m_x + 4, m_y + 3); }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务