2012-12-13 49 views
4

考慮:當您有類層次結構時,調用方法的順序是什麼?

class Mobile { 
    double memory_util; 
    public: 
    virtual void power_save(double duration) = 0; 
}; 

class Laptop : public Mobile { 
    bool is_unlocked; 
    protected: 
    bool is_charged; 
    public: 
    void power_save(double duration); 
    virtual double remaining_time(); 
}; 

class NegativeNumber {}; 
class IPad : public Laptop { 
    int generation; 
    public: 
    void power_save(double duration); 
    bool isJailBroken(); 
}; 

class HPLaptop : public Laptop { 
    int warranty_years; 
    public: 
    void extend_warranty(int years); 
}; 

class HPdv6 : public HPLaptop { 
    bool repaired; 
    public: 
    double remaining_time(){ return HPLaptop::remaining_time(); } 
    bool is_repaired { return repaired; } 
}; 

你想做到以下幾點:

int main() { 
    Mobile* d = new HPdv6(); 
    Laptop *s = d; 
    d->power_save(100); 
    cout << 「remaining operation time: 」 << 
    s->remaining_time() << endl; 
    return 0; 
} 

哪些方法實際上在這裏叫什麼名字?據我所知,移動是一個虛函數,但我不知道該如何處理的類層次結構,當你有這樣的指針。是否有關於類層次結構的任何提示可以使處理各種繼承類的問題更容易理解?

謝謝。

+0

'筆記本電腦* S = d;'不能編譯,因爲你需要某種形式的垂頭喪氣。 – chris

+0

請解釋。 –

+0

另外,假設它編譯... –

回答

3

一旦你整理出在Laptop *s = d;錯誤(見static_cast<>()),你會發現HPdv6remaining_time()將被稱爲和Laptoppower_save()會被調用。

過度簡化,功能由開始HPdv6,直到該方法被發現走上了繼承樹解決。 IPad將不會被使用,因爲它不HPdv6Laptop之間出現,它坐落在一個單獨的分支。

如果你想在非過於簡化版本,擡頭vtables。這是對他們的維基百科文章:http://en.wikipedia.org/wiki/Virtual_method_table

+0

如果它繼承樹,爲什麼不d-> power_save(100)調用Ipad的power_save?並且s-> remaining_time()應該調用Hpdv6的remaining_time(),對吧? –

+0

爲什麼筆記本電腦的power_save()被調用,而不是Ipad的power_save()? –

+0

對不起,我編輯了第一句語法。如果您將類映射爲樹,則「IPad」在樹中,但不在「Laptop」和「HPdv6」之間的鏈中。 –

相關問題