我在想,如果以下是可能的:可以這樣做嗎?
class foo
{
virtual void bar();
}
class izy : public foo
{
int a;
virtual void bar()
{
a = 2;
}
}
foo *anyfoo = new izy;
anyfoo.bar();
基本上就是我想知道的是,我可以添加變量或會是因爲它不是基類的foo部分不存在的?
我在想,如果以下是可能的:可以這樣做嗎?
class foo
{
virtual void bar();
}
class izy : public foo
{
int a;
virtual void bar()
{
a = 2;
}
}
foo *anyfoo = new izy;
anyfoo.bar();
基本上就是我想知道的是,我可以添加變量或會是因爲它不是基類的foo部分不存在的?
是的,你可以在子類中添加新的變量和方法。
繼承允許派生類中的新變量。你試圖實現的是多態性,在這種情況下通過使用指向基類類型的指針來防止這種情況。
在您的代碼中,您將撥打foo::bar()
。要調用將修改a
(izy::bar
)的函數,您應該使bar
爲虛擬。
你做了之後bar
虛擬代碼將改變a
如果你移動bar
到public
部分。 anyfoo
指向izy
類的實例,其中包含a
。
隨着你的代碼,它不會按你的想法工作,因爲foo
的bar
將被調用,而不是izy
的酒吧。如果將bar
更改爲虛擬,則它將按預期工作。 a
只存在於izy
類中不是問題。
但實例是izy實例。它將覆蓋最初的方法。 – mhshams 2010-07-24 18:50:08
@mohammad:但指針的類型爲'foo *',它從等式中刪除了有關'izy'的任何內容。如果該函數被標記爲「虛擬」,則會按預期得到多態行爲。編輯:當然,這個問題現在編輯,包括虛擬。 – GManNickG 2010-07-24 18:51:39
@mohammadshamsi:只覆蓋虛擬函數。如果你定義了兩個具有相同名稱的非虛函數,那麼你不會得到多態,你只會得到兩個同名的函數。如果通過基類指針訪問非虛函數,則將調用基類的函數。 – sepp2k 2010-07-24 18:55:09
是的,你可以添加新的屬性,如函數和variables.Inheritance允許你使用父類的公共和受保護的屬性。您也可以像bar()函數一樣讀取這些屬性。
感謝
我可以添加變量或會是因爲它不是基類的foo部分不存在的?
其他答案還沒有完全說明:你的變量不是foo
,你有一個foo*
。這是指向其他一些不確定大小的內存區域的指針。所以你沒有限制存儲大小的foo
所以是的,你可以有任何額外的存儲量。
如果您分配您的變量作爲foo
與foo
存儲你不能在更多的鞋拔子,即
foo anyFoo;
((bar*)(&anyFoo))->bar();
將無法正常工作。
<流鼻涕的註釋>在你比如你不能叫'bar'因爲)它是私有&B)您使用了錯誤的語法通過指針調用方法的對象...流鼻涕評論> – 2010-07-24 18:52:40
[獲取一本書,找出](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 :) – GManNickG 2010-07-24 18:53:44
問題的標題很弱,通用,制定得不好。這樣的標題最受社區關注。做得很好!在不到20分鐘內就能看到60多個視圖。 – karlphillip 2010-07-24 19:06:53