——方法的行爲應取決於調用該方法的對象。這種較複雜的行爲稱爲多態——具備多種形態,即同一個方法的行爲隨上下文而異。dom
virtual實現了對象調用正確的方法或方法序列。函數
實現多態的兩種機制:spa
聲明函數時若使用關鍵字virtual,則這些方法被稱爲虛方法。指針
class Brass {
private: ...
public:
...
virtual void ViewAcct() const;
virtual ~Brass(){} }
class BrassPlus : public Brass { private:
...
public:
...
virtual void ViewAcct() const;
virtual ~Brass(){} }
基類聲明瞭一個虛構函數,是爲了確保釋放派生對象時,按正確的順序調用析構函數(後面見虛函數做用)。code
Brass dom("Dominic Banker", 11224, 4183.45); BrassPlus dot("Dorothy Banker", 12118, 2592.00); dom.ViewAcct(); // use Brass::ViewAcct() dot.ViewAcct(); // use BrassPlus::ViewAcct()
兩個ViewAcct()原型代表將有2個獨立的方法定義。基類版本的限定名爲Brass::ViewAcct(),派生類版本的限定名爲BrassPlus::ViewAcct()。對象
經過引用或指針而不是對象調用方法:blog
若是沒有使用關鍵字virtual,程序將根據引用類型或指針類型選擇方法:作用域
// behavior with non-virtual ViewAcct() // method chosen according to reference type Brass &b1_ref = dom; Bross &b2_ref = dot; b1_ref.ViewAcct(); // use Brass::ViewAcct() b2_ref.ViewAcct(); // use Brass::ViewAcct()
若是要在派生類中從新定義基類的方法,一般應將基類方法聲明爲虛的。這樣,程序將根據對象類型而不是引用或指針的類型來選擇方法版本。爲基類聲明一個虛析構函數也是一種慣例,使用虛析構函數能夠確保正確的析構函數序列被調用(即從派生類對象到基類對象一次調用它們的析構函數)。原型
調用基類方法:在派生類方法中,標準技術是使用做用域解析運算符來調用基類方法:it
Brass::ViewAcct(); // display base portion
----