看板 C_and_CPP 關於我們 聯絡資訊
我有一個指標與class繼承的問題 如果我們用父類別的指標來指向子類別,那麼他是屬於什麼呢? 跑相同函式應該跑得位子為何? 如有一程式程式碼大概如下: class V { public: 建構子等等… string Name() {return namestr;} void changestate(int x){ if (x>5) state=0; else state=1;} somebody; protected: string namestr; int state; somebody; } class C :public V { publicL somebody…; void changestate(int x) state=100; } int main() { V *v_ptr = new C; v_ptr->changestate; } 那麼 *v_ptr所指向的物件,應該是V還是C? 如果是V,那麼他會有C獨有的函式以及宣告變數嘛? 還是小弟我的觀念全部都是錯誤的,不是這麼看待 煩請各位解答,謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.170.201.51 ※ 編輯: StephenNash 來自: 118.170.201.51 (11/04 00:08)
james732:我建議你跑跑看、觀察結果,對照書本,再上來說說想法 XD 11/04 00:15
StephenNash:有跑過了,我觀念不夠好 @@ 我怕我理解錯誤 11/04 00:15
StephenNash:他是屬於C這個類別的物件嘛? 11/04 00:19
loveflames:記得dtor要宣告virtual 11/04 00:19
loveflames:是指標而不是物件吧 11/04 00:20
StephenNash:那麼寫V *v_ptr = new C; 和C *v_ptr = new C; 11/04 00:23
StephenNash:有什麼不同嘛? 11/04 00:23
james732:http://nopaste.csie.org/f346e 你可以看看這隻小程式 11/04 00:28
loveflames:沒宣告virtual的function就有差了 11/04 00:29
james732:http://nopaste.csie.org/97cb2 同場加映virtual的意義 11/04 00:29
StephenNash:嗯,我好像知道有加virtual會連結到晚期的,也就是自 11/04 00:34
StephenNash:記得負函式,我的疑惑在於為什麼可以拿V 宣告的指標 11/04 00:35
StephenNash:去指向c 11/04 00:35
LPH66:單純只是因為 C "is a" V 而已 (這就是繼承的"is a"關係) 11/04 00:35
loveme00835:簡單記住一個原則: 父類別如果沒有任何virtual函式, 11/04 00:35
loveme00835:表示他不想被人家繼承, 繼承表示「子類別物件也算一種 11/04 00:36
loveme00835:父類別物件」所以用指標去指當然合法, 這是語意層面的 11/04 00:37
loveme00835:問題 11/04 00:37
StephenNash:那麼如果C有一些V沒有的東西,那麼也可以指向囉? 11/04 00:40
james732:其實指標寫 A *a; B *b = (B*)a; 不管A B是什麼都會過關 11/04 00:41
james732:只是會發生啥事沒人知道而已...XD 11/04 00:41
james732:只要有寫(B*)這樣的強制轉型,怎麼轉都可以,只是不安全 11/04 00:43
loveme00835:看你使用什麼型別的指標去操作, 用型別 V 的指標去指, 11/04 00:43
loveme00835:最多只能用到類別 V 所定義的東西 11/04 00:43
loveflames:喜歡的話拿int的指標去指也可以 11/04 00:44
StephenNash:…所以這是未定義事件嘛? 謝謝大家的回覆@@ 好感動 11/04 00:45
StephenNash:哦 所以只能指共通擁有的東西就是了@@ 11/04 00:46
james732:正確來說,你只能使用共通擁有的東西,才能保證不會錯誤 11/04 00:46
StephenNash:那如果加virtual的話,就會指向C ,不加的話編譯器便會 11/04 00:49
StephenNash:錯誤指向V,大概是這樣囉 11/04 00:49
loveme00835:樓上是什麼結論阿= =" 11/04 00:52
james732:virtual應該是說會動態的選擇正確的函式 11/04 00:52
StephenNash:我不太懂,只是跑出來好像是這樣…對不起喔 11/04 00:52