2016-09-05 247 views
-10

假設我有這樣一段代碼:C++抽象類的繼承

class Vehicle { 
    virtual const char* media() const = 0; 
    virtual unsigned speed() const = 0; 
} V, *PV; 
class LandVehicle : public Vehicle { 
    const char* media() const override{ return "Land";} 
} L, *PL; 
class Train : public LandVehicle{ 
    virtual unsigned speed() const override {return 130;} 
} T, *PT; 

我有一個關於它的幾個問題:d

1)LandVehicle不執行速度()。是一個錯誤,如果是的話,什麼樣的錯誤?還是隻是讓它成爲一個抽象類?

2)是關鍵字覆蓋在類LandVehicle方法media()中使用是否正確?作爲一個抽象類的派生類是否真的覆蓋了該方法?

3)與2相同覆蓋列車的速度()方法。

4)現在正在培訓具體的課程嗎?

5)是否需要在LandVehicle的media()方法的聲明中添加關鍵字virtual

6)如果我在火車類中添加這個方法:

const char* media() const{ return "Just a train";} 

它隱藏LandVehicle的媒體()或它覆蓋它?

7)在6中加入方法後,LandVehicle的媒體()可以在Train類中訪問嗎?

+6

有太多的問題,其中大部分你可以自己測試它快速找到答案。 – Aracthor

+0

你有沒有試過自己研究過?你發現了什麼以及它沒有回答你的問題? – Angew

+1

我同意這裏。快速編寫代碼/測試輸出通常比在stackoverflow上輸入代碼/問題要快。 – Hayt

回答

5

1.)是的LandVehicle仍然是抽象的。要使類可實例化,您需要實現所有純虛擬方法。

2.)是的。 override是編譯器的關鍵字,它應該重寫另一個方法。如果你更改基類中的簽名。編譯器會在這裏給你一個錯誤(如果你不使用覆蓋,它假設它是一個「新」的方法)

3.)與2相同的答案用戶覆蓋儘可能經常如果你重寫方法。

4.)是的。所有純粹的虛擬(抽象)方法現在都有一個實現。

5.)不可以。虛擬只需添加到基類中。對於相同的方法,在派生類中不需要它。

6.)是的。 overrride只是編譯器檢查的關鍵字。它並不是真的在做這個重要事情(virtual對此很重要)。如果聲明中可以忽略重寫,但總是使用它通常更安全。

7)是的,你可以使用LandVehicle::media()