[問題] 一個物件以及指標的問題。

看板C_and_CPP作者 (奈許)時間15年前 (2010/11/04 00:07), 編輯推噓5(5028)
留言33則, 5人參與, 最新討論串1/3 (看更多)
我有一個指標與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)

11/04 00:15, , 1F
我建議你跑跑看、觀察結果,對照書本,再上來說說想法 XD
11/04 00:15, 1F

11/04 00:15, , 2F
有跑過了,我觀念不夠好 @@ 我怕我理解錯誤
11/04 00:15, 2F

11/04 00:19, , 3F
他是屬於C這個類別的物件嘛?
11/04 00:19, 3F

11/04 00:19, , 4F
記得dtor要宣告virtual
11/04 00:19, 4F

11/04 00:20, , 5F
是指標而不是物件吧
11/04 00:20, 5F

11/04 00:23, , 6F
那麼寫V *v_ptr = new C; 和C *v_ptr = new C;
11/04 00:23, 6F

11/04 00:23, , 7F
有什麼不同嘛?
11/04 00:23, 7F

11/04 00:28, , 8F
http://nopaste.csie.org/f346e 你可以看看這隻小程式
11/04 00:28, 8F

11/04 00:29, , 9F
沒宣告virtual的function就有差了
11/04 00:29, 9F

11/04 00:29, , 10F
http://nopaste.csie.org/97cb2 同場加映virtual的意義
11/04 00:29, 10F

11/04 00:34, , 11F
嗯,我好像知道有加virtual會連結到晚期的,也就是自
11/04 00:34, 11F

11/04 00:35, , 12F
記得負函式,我的疑惑在於為什麼可以拿V 宣告的指標
11/04 00:35, 12F

11/04 00:35, , 13F
去指向c
11/04 00:35, 13F

11/04 00:35, , 14F
單純只是因為 C "is a" V 而已 (這就是繼承的"is a"關係)
11/04 00:35, 14F

11/04 00:35, , 15F
簡單記住一個原則: 父類別如果沒有任何virtual函式,
11/04 00:35, 15F

11/04 00:36, , 16F
表示他不想被人家繼承, 繼承表示「子類別物件也算一種
11/04 00:36, 16F

11/04 00:37, , 17F
父類別物件」所以用指標去指當然合法, 這是語意層面的
11/04 00:37, 17F

11/04 00:37, , 18F
問題
11/04 00:37, 18F

11/04 00:40, , 19F
那麼如果C有一些V沒有的東西,那麼也可以指向囉?
11/04 00:40, 19F

11/04 00:41, , 20F
其實指標寫 A *a; B *b = (B*)a; 不管A B是什麼都會過關
11/04 00:41, 20F

11/04 00:41, , 21F
只是會發生啥事沒人知道而已...XD
11/04 00:41, 21F

11/04 00:43, , 22F
只要有寫(B*)這樣的強制轉型,怎麼轉都可以,只是不安全
11/04 00:43, 22F

11/04 00:43, , 23F
看你使用什麼型別的指標去操作, 用型別 V 的指標去指,
11/04 00:43, 23F

11/04 00:43, , 24F
最多只能用到類別 V 所定義的東西
11/04 00:43, 24F

11/04 00:44, , 25F
喜歡的話拿int的指標去指也可以
11/04 00:44, 25F

11/04 00:45, , 26F
…所以這是未定義事件嘛? 謝謝大家的回覆@@ 好感動
11/04 00:45, 26F

11/04 00:46, , 27F
哦 所以只能指共通擁有的東西就是了@@
11/04 00:46, 27F

11/04 00:46, , 28F
正確來說,你只能使用共通擁有的東西,才能保證不會錯誤
11/04 00:46, 28F

11/04 00:49, , 29F
那如果加virtual的話,就會指向C ,不加的話編譯器便會
11/04 00:49, 29F

11/04 00:49, , 30F
錯誤指向V,大概是這樣囉
11/04 00:49, 30F

11/04 00:52, , 31F
樓上是什麼結論阿= ="
11/04 00:52, 31F

11/04 00:52, , 32F
virtual應該是說會動態的選擇正確的函式
11/04 00:52, 32F

11/04 00:52, , 33F
我不太懂,只是跑出來好像是這樣…對不起喔
11/04 00:52, 33F
文章代碼(AID): #1CqOZFw8 (C_and_CPP)
文章代碼(AID): #1CqOZFw8 (C_and_CPP)