2013-08-22 39 views
1

我上課是這樣的:C++派生類重寫與其他派生類的基類成員?

class ParkingLot 
{ 
public: 
    int spaces; 
    virtual bool something() { return true; } 
} 
class ParkingLotBuilding 
{ 
public: 
    ParkingLot Floor1, Floor2; 
} 

我做過了很多的採取ParkingLotBuilding功能。比方說,某人(我)從ParkingLot派生和ParkingLotBuilding:

class DerivedParkingLot : public ParkingLot 
{ 
public: 
    virtual bool something() { return false; } 
} 
class DerivedParkingLotBuilding : public ParkingLotBuilding 
{ 
public: 
    // how can I make it so that Floor1 and Floor2 are for DerivedParkingLot? 
} 

我有功能我不控制是這樣的:

CheckBuilding(ParkingLotBuilding &building) 
{ 
    if(building.Floor1.something() == true) 
    // error 
} 

如果我通過一個DerivedParkingLotBuilding對象到功能我如何使它調用DerivedParkingLot :: something()來返回false?那可能嗎?對不起,如果我沒有解釋這個權利,我不知道如何問這個問題。謝謝

+2

您不能覆蓋成員,只有方法 – UnknownError1337

+0

添加到JohnSmith所說的內容中:由於'ParkingLotBuilding'包含'ParkingLot'值,而不是'ParkingLot'指針或引用,因此即使在DerivedParkingLot中也不能使用多態。 – zindorsky

+0

@zindorsky我認爲這是正確的答案。如果您或約翰想將其作爲答案提交併解釋,我會將其標記爲正確。 – user2672807

回答

0

正如JohnSmith所指出的那樣,您不能覆蓋數據成員,只能使用成員函數。由於ParkingLotBuilding包含ParkingLot值,而不是ParkingLot指針或引用,因此即使在DerivedParkingLot中也不能多態使用它們。 (這就是C++的工作原理:只有指針和引用可以有一個動態類型。)

這意味着如果你不能更改ParkingLotBuilding類(或CheckBuilding函數),那麼你卡住了。沒有可以做的派生,這將使CheckBuilding函數在DerivedParkingLot對象上運行。

這個故事的寓意是類必須被設計爲從一開始就繼承。

0

事實上,你只是從ParkingLot實例調用DerivedParkingLot函數?

您的代碼已經通過將某些方法指定爲虛擬方法來完成它,它會自動搜索其繼承樹中最低的方法。

一個簡單的方法來測試它是落實ParkingLot和DerivedParkingLot的一些方法,在每把不同的消息,並檢查它,你也許能接近,這是通過使ParkingLot模板類

0

的一種方式。

template<typename T> 
class ParkingLotBuilding 
{ 
public: 
    T Floor1, Floor2; 
} 

然後創建一個ParkingLotBuilding時,你可以使用這些類型:

ParkingLotBuilding<ParkingLot> 
ParkingLotBuilding<DerivedParkingLot> 

此外,如果你不喜歡的模板化所有的時間,並希望只使用ParkingLotBuildingDerivedParkingLotBuilding,你可以重命名類像Building和使用typedef:

typedef Building<ParkingLot> ParkingLotBuilding 
typedef Building<DerivedParkingLot> DerivedParkingLotBuilding 

這種做法是不是0123之間究竟繼承類型(也許不是最好的方法 - 我以前從未見過),但它可能會做你所需要的。

0

在您的示例中,Floor1無法知道它是在ParkingLotBuilding還是DerivedParkingLotBuilding中實例化的。

你可以使用RTTI來處理這個類似:

CheckBuilding (ParkingLotBuilding *building) 
{ 
    if (dynamic_cast<DerivedParkingLogBuilding*>(building)) 
    { 
     // Floor is in a derived parking log building 
    } 
    else 
    { 
     // Floor is in a parking lot building 
    } 
} 

不正是最好的是,雖然這樣做的,如上指出。