2011-02-28 22 views
4

假設你有以下對象層次結構:C++爲什麼不是第二個表達式有效?

class Vehicle { 
public: 
    virtual ~Vehicle() {} 
}; 
class LandCraft: public Vehicle {}; 
class Truck: public LandCraft {}; 

現在,我們有兩個表達式:

Truck truck; 
Vehicle& vehicle = truck; 

根據解決一門功課,第二個表達式是無效的。但爲什麼?我的編譯器根本沒有抱怨,而且我也沒有看到這裏應該出現什麼問題。

+0

哪個編譯器?你是否嘗試過「pedantic」標誌(或同等標誌)? – suszterpatt 2011-02-28 16:12:19

+0

對我來說似乎也是正確的,因爲通過使用對「Vehicle」的引用避免了「切片」問題(http://stackoverflow.com/questions/2822146/references-and-the-slicing-problem)。 – James 2011-02-28 16:13:27

+0

看起來不錯。這個問題是否真的使用'車輛&'?如果它只是使用'車輛',那麼你會有切片問題。 – 2011-02-28 16:13:41

回答

6

這聽起來像家庭作業的解決方案是不正確的。從派生實例初始化對基類型的引用沒有任何問題。

編輯

正如一些人所指出的那樣(Slaks特別),而有什麼不對這個說法本身,它爲未來的道路發生錯誤的可能性。它允許你任意地將任何Vehicle放置到期望Truck的地方。例如考慮以下內容

Truck truck; 
Vehicle& reallyATruck = truck; 
reallyATruck = LandCraft(); 

哎呀!

+0

我沒有看到任何不安全的地方。這只是一個切片問題,與引用無關,只是多態。 – GManNickG 2011-02-28 19:55:31

1

第二個表達式完全有效。您可能會誤解解決方案所說的內容。也許這並不是說它在語法上是無效的,但有其他一些問題。

當你正在使用的課程沒有虛擬功能時,看起來有點奇怪和可疑。

我的傾向是,作業解決方案只是錯誤的。但是讓它變得如此簡單的錯誤似乎很奇怪。

1

對不起,但我已經驗證您的代碼在Visual Studio 2010中運行良好,除了您在類Vehicle的末尾錯過了分號。

1

SLaks已經解釋了爲什麼表達不安全,但它是合法的。

根據Comeau的說法,唯一的錯誤是在class Vehicle {} /* HERE */末尾丟失分號。

+0

我的答案是否正確? – SLaks 2011-02-28 16:20:55

+0

@SLaks:在您編輯之後它是正確的,我希望人們開始扭轉他們的低估。 – 2011-02-28 16:22:20

+0

該表達式不是以任何方式不安全的,事實上它在變元傳遞中被廣泛使用。事實上,你可以切分不同類型的對象(SLaks演示)與表達無關。並且要說清楚,我只是在編輯之後閱讀SLaks的答案,並因爲這個特殊原因而低估了答案。 – 2011-02-28 17:12:35

相關問題