2013-01-03 59 views
0
class a 
{ 
    public: 
     a(int);  
     virtual ~a(); 
     virtual void print(); 
     int getNumber() 
    private: 
     int number; 
}; 

class b : public a 
{ 
    public: 
     b(int); 
     virtual ~b(); 
}; 

class c : public b 
{ 
    public: 
     c(int); 
     virtual ~c(); 
     virtual void print(); 
}; 

這些是表示cpp文件的標題。我在每個適當的cpp文件中實現了所有的方法。 我用這個代碼,它工作得很好,雖然我不知道b類是否也應該實現 print(即使是這樣:print(){}),因爲在我看來,編程更好。 那麼做到這一點的適當方法是什麼? 執行(即使沒有必要)或不?虛擬,如何使用它?

+0

謝謝編輯 –

回答

0

您應該只編寫將由子類重載的函數。如果子類不是特定給定的行爲,那麼在子類中編寫一個父函數的副本是不好的做法。這不僅會造成浪費,而且可能會造成混淆,也可能導致以後出現錯誤。

考慮一下:一個父類,我會叫猴子和一個子類,我會打電話給泰山。在Monkey類中,我將爲Swing()定義一個函數。

現在,由於泰山是猴子的衍生物,並且學會像猴子一樣在樹木中擺動,所以不需要編寫泰山自己版本的擺動功能。但是,讓我們說,無論如何,我的確寫了「完整」。現在我有兩個例程需要更新,如果我需要改變一個猴子的搖擺方式:一個猴子類和另一個泰山。更糟糕的是,如果我改變一個猴子的搖擺和忘記在Tarzan作出相同的變化,泰山將不再像猴子一樣搖擺,這將是意想不到的,可能是錯誤的。

結論:只能在子類函數中編寫代碼,其中子類需要專門化的父類已定義的代碼。

+0

你是對的。謝謝 !! –

1

面向對象編程中的整個繼承點是您可以依賴於您不想重寫的方法的超類實現。