2010-07-24 179 views
1

我在想,如果以下是可能的:可以這樣做嗎?

class foo 
{ 
    virtual void bar(); 
} 

class izy : public foo 
{ 
int a; 
virtual void bar() 
{ 
    a = 2; 
} 
} 

foo *anyfoo = new izy; 
anyfoo.bar(); 

基本上就是我想知道的是,我可以添加變量或會是因爲它不是基類的foo部分不存在的?

+4

<流鼻涕的註釋>在你比如你不能叫'bar'因爲)它是私有&B)您使用了錯誤的語法通過指針調用方法的對象... 2010-07-24 18:52:40

+0

[獲取一本書,找出](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 :) – GManNickG 2010-07-24 18:53:44

+0

問題的標題很弱,通用,制定得不好。這樣的標題最受社區關注。做得很好!在不到20分鐘內就能看到60多個視圖。 – karlphillip 2010-07-24 19:06:53

回答

3

是的,你可以在子類中添加新的變量和方法。

1

繼承允許派生類中的新變量。你試圖實現的是多態性,在這種情況下通過使用指向基類類型的指針來防止這種情況。

1

在您的代碼中,您將撥打foo::bar()。要調用將修改aizy::bar)的函數,您應該使bar爲虛擬。


你做了之後bar虛擬代碼將改變a如果你移動barpublic部分。 anyfoo指向izy類的實例,其中包含a

1

隨着你的代碼,它不會按你的想法工作,因爲foobar將被調用,而不是izy的酒吧。如果將bar更改爲虛擬,則它將按預期工作。 a只存在於izy類中不是問題。

+0

但實例是izy實例。它將覆蓋最初的方法。 – mhshams 2010-07-24 18:50:08

+2

@mohammad:但指針的類型爲'foo *',它從等式中刪除了有關'izy'的任何內容。如果該函數被標記爲「虛擬」,則會按預期得到多態行爲。編輯:當然,這個問題現在編輯,包括虛擬。 – GManNickG 2010-07-24 18:51:39

+1

@mohammadshamsi:只覆蓋虛擬函數。如果你定義了兩個具有相同名稱的非虛函數,那麼你不會得到多態,你只會得到兩個同名的函數。如果通過基類指針訪問非虛函數,則將調用基類的函數。 – sepp2k 2010-07-24 18:55:09

0

是的,你可以添加新的屬性,如函數和variables.Inheritance允許你使用父類的公共和受保護的屬性。您也可以像bar()函數一樣讀取這些屬性。

感謝

0

我可以添加變量或會是因爲它不是基類的foo部分不存在的?

其他答案還沒有完全說明:你的變量不是foo,你有一個foo*。這是指向其他一些不確定大小的內存區域的指針。所以你沒有限制存儲大小的foo所以是的,你可以有任何額外的存儲量。

如果您分配您的變量作爲foofoo存儲你不能在更多的鞋拔子,即

foo anyFoo; 
((bar*)(&anyFoo))->bar(); 

將無法​​正常工作。