類的繼承例子:
以上個動態銀河系的制作為例,假設我們定義了一個星星的類如下:
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); }