看板 C_and_CPP 關於我們 聯絡資訊
程式執行沒有問題,如下: #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
snowlike:這和 int *ptr; int *a=&num; ptr=*a; 不是相同嗎 05/19 21:31
snowlike: int a=num; 應該要&a; 不好意思我跳著看 05/19 21:35
※ 編輯: conan77420 來自: 115.43.50.25 (05/19 21:36)
conan77420:不好意思我手誤打錯XD 05/19 21:36
loveme00835:陣列 a 裡每一個元素跟 ptr 的型態都是 Animal*, 所以 05/19 21:43
loveme00835:在 assign 的時候很直覺的寫法應該是不加任何*或& 05/19 21:44
loveme00835:這時候用 Animal* a[ 6 ]; 會比較好解讀型態, 你可能 05/19 21:48
loveme00835:把 a 跟 ptr 想成同型態了 05/19 21:49
loveme00835:我好像回錯 Q 口 Q, 以上請當我沒推 05/19 21:55
loveme00835:你可以把ptr 指向不同物件, 像是 ptr = &Bird; 多型是 05/19 21:56
loveme00835:在執行時期確定物件的類別, 而你第一次寫的版本強制的 05/19 21:58
loveme00835:把 父類別物件 = 子類別物件, 子類別所包含的資訊全都 05/19 21:59
loveme00835:消失了, 然後 ptr = &a[randomunmber]; ptr 指到的實 05/19 22:00
loveme00835:際還是Animal 物件, 所以並沒有任何多型的行為 05/19 22:00
對對,我就是想問這個 可是我是把子類別的物件塞到父類別的物件中 而不是父類別的放入子類別的 為什麼會消失呀 ※ 編輯: conan77420 來自: 115.43.50.25 (05/19 22:09)
loveme00835:想像子類別除了繼承父類別的成員, 還可以額外擴充新的 05/19 22:12
loveme00835:成員, 所以子類別物件包的東西可能比父類別物件來得多 05/19 22:13
loveme00835:當你這樣assign的時候, 一個父類別物件是裝不了那麼多 05/19 22:14
loveme00835:成員的, 所以關於子類別的資訊(或成員)就會遺失掉 05/19 22:15
loveme00835:相反的 : 子類別物件 = 父類別物件, 也不合法, 因為一 05/19 22:16
loveme00835:個父類別物件「不是」一個子類別物件 05/19 22:18
snowlike:取決於ptr指向型態是父還是子類而已,子類裝父類多型仍可 05/19 22:19
snowlike:不過要額外定義對子類對父類別的assign行為就是了 05/19 22:20
loveme00835:子類 = 父類, 行為還是子類的行為, 允許這樣的行為可 05/19 22:27
loveme00835:能要對子類的成員負一些管理的責任 05/19 22:28
conan77420:原來這樣不合法,謝謝回答  05/19 22:35