类的继承例子:
以上个动态银河系的制作为例,假设我们定义了一个星星的类如下:
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()这两个函数,所以我们可以利用类继承的方法来实现,再使用同函数名覆盖的方法来写类,有三种继承的方式如下表所示:
派生方式 | 基类的public成员 | 基类的protected成员 | 基类的private成员 | 派生方式引起的访问属性变化概括 |
private派生 | 变为private成员 | 变为private成员 | 不可见 | 基类中的非私有成员都成为派生类中的私有成员 |
protected派生 | 变为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); }