[問題] 多型陣列指標問題

看板C_and_CPP (C/C++)作者 (人生就是不停的戰鬥)時間16年前 (2010/05/19 21:18), 編輯推噓2(2022)
留言24則, 3人參與, 最新討論串1/1
程式執行沒有問題,如下: #include<iostream.h> #include<time.h> using namespace std; class Animal { public: virtual int movemethod() {cout<<"Unspecified"<<endl;} }; class Bird :public Animal { public: virtual int movemethod(){cout<<"fly"<<endl;} }; class Dog :public Animal { public: virtual int movemethod(){cout<<"run"<<endl;} }; class Fish :public Animal { public: virtual int movemethod(){cout<<"swim"<<endl;} }; int main() { Animal *ptr; Bird bird; Fish fish; Dog dog; Animal *a[6]; a[0]=&bird; a[1]=&bird; a[2]=&bird; a[3]=&fish; a[4]=&fish; a[5]=&dog; for(int i=1 ; i<=10 ; i++) { int randomunmber=rand()%6; ptr=a[randomunmber]; ptr->movemethod(); } system("pause"); } =================================== 其中 Animal *a[6]; a[0]=&bird; a[1]=&bird; a[2]=&bird; a[3]=&fish; a[4]=&fish; a[5]=&dog; 上面是我第二次的寫法 一開始我想法是這樣: Animal a[6]; a[0]=bird; a[1]=bird; a[2]=bird; a[3]=fish; a[4]=fish; a[5]=dog; 然後 ptr=&a[randomunmber]; 想請問為什麼不能這樣寫,很直覺的就想這樣寫呀 =口= 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 115.43.50.25

05/19 21:31, , 1F
這和 int *ptr; int *a=&num; ptr=*a; 不是相同嗎
05/19 21:31, 1F

05/19 21:35, , 2F
int a=num; 應該要&a; 不好意思我跳著看
05/19 21:35, 2F
※ 編輯: conan77420 來自: 115.43.50.25 (05/19 21:36)

05/19 21:36, , 3F
不好意思我手誤打錯XD
05/19 21:36, 3F

05/19 21:43, , 4F
陣列 a 裡每一個元素跟 ptr 的型態都是 Animal*, 所以
05/19 21:43, 4F

05/19 21:44, , 5F
在 assign 的時候很直覺的寫法應該是不加任何*或&
05/19 21:44, 5F

05/19 21:48, , 6F
這時候用 Animal* a[ 6 ]; 會比較好解讀型態, 你可能
05/19 21:48, 6F

05/19 21:49, , 7F
把 a 跟 ptr 想成同型態了
05/19 21:49, 7F

05/19 21:55, , 8F
我好像回錯 Q 口 Q, 以上請當我沒推
05/19 21:55, 8F

05/19 21:56, , 9F
你可以把ptr 指向不同物件, 像是 ptr = &Bird; 多型是
05/19 21:56, 9F

05/19 21:58, , 10F
在執行時期確定物件的類別, 而你第一次寫的版本強制的
05/19 21:58, 10F

05/19 21:59, , 11F
把 父類別物件 = 子類別物件, 子類別所包含的資訊全都
05/19 21:59, 11F

05/19 22:00, , 12F
消失了, 然後 ptr = &a[randomunmber]; ptr 指到的實
05/19 22:00, 12F

05/19 22:00, , 13F
際還是Animal 物件, 所以並沒有任何多型的行為
05/19 22:00, 13F
對對,我就是想問這個 可是我是把子類別的物件塞到父類別的物件中 而不是父類別的放入子類別的 為什麼會消失呀 ※ 編輯: conan77420 來自: 115.43.50.25 (05/19 22:09)

05/19 22:12, , 14F
想像子類別除了繼承父類別的成員, 還可以額外擴充新的
05/19 22:12, 14F

05/19 22:13, , 15F
成員, 所以子類別物件包的東西可能比父類別物件來得多
05/19 22:13, 15F

05/19 22:14, , 16F
當你這樣assign的時候, 一個父類別物件是裝不了那麼多
05/19 22:14, 16F

05/19 22:15, , 17F
成員的, 所以關於子類別的資訊(或成員)就會遺失掉
05/19 22:15, 17F

05/19 22:16, , 18F
相反的 : 子類別物件 = 父類別物件, 也不合法, 因為一
05/19 22:16, 18F

05/19 22:18, , 19F
個父類別物件「不是」一個子類別物件
05/19 22:18, 19F

05/19 22:19, , 20F
取決於ptr指向型態是父還是子類而已,子類裝父類多型仍可
05/19 22:19, 20F

05/19 22:20, , 21F
不過要額外定義對子類對父類別的assign行為就是了
05/19 22:20, 21F

05/19 22:27, , 22F
子類 = 父類, 行為還是子類的行為, 允許這樣的行為可
05/19 22:27, 22F

05/19 22:28, , 23F
能要對子類的成員負一些管理的責任
05/19 22:28, 23F

05/19 22:35, , 24F
原來這樣不合法,謝謝回答 
05/19 22:35, 24F
文章代碼(AID): #1By-Kc59 (C_and_CPP)
文章代碼(AID): #1By-Kc59 (C_and_CPP)