c++ 類的繼承和多態例子


類的繼承例子:

以上個動態銀河系的制作為例,假設我們定義了一個星星的類如下:

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);
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM