看板 C_and_CPP 關於我們 聯絡資訊
請問關於多型的用法 class Animal { void hello() { printf("I am animal"); } } class Dog : Animal { void hello() { printf("I am dog"); } } class Cat : Animal { void hello() { printf("I am cat"); } } 想請問若用 Animal a = new Dog; a.hello(); 會出現I am dog 與 Dog a = new Dog; a.hello() 這樣用法上有什麼區別呢 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.233.135.153 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1521264760.A.593.html
xam: 等你真的試過再來問... 03/17 14:15
bluesoul: 第二種用法意義不大 03/17 14:16
james732: void foo(Amimal *a) { a->hello(); } 03/17 14:32
james732: 這種情況foo不必知道是什麼動物,只要知道它會說hello 03/17 14:32
james732: 可以用"它能做什麼"取代"它是什麼" 03/17 14:33
james732: 不同類型但行為相同的程式碼就可以重覆使用 03/17 14:33
loveflames: 你這個根本不是多型,沒宣告virtual 03/17 15:21
dzwei: 第1.如同樓上說的,沒有虛擬化函數,不算多型 03/17 15:29
dzwei: 第二,要多型的話,建立物件的方式要採用Pointer 03/17 15:30
dzwei: e.g. Dog* a = new Dog 03/17 15:31
loveflames: reference也可以,但沒有指標通用 03/17 16:31
loveflames: 另外,雖然virtual方法是一般意義下的多型,但C++可以 03/17 16:33
loveflames: 用CRTP來搞靜態多型,這時就可以是non-virtual 03/17 16:33
dzwei: 我記得CRTP就一定要用指標而不能Ref了。 03/17 17:03
dzwei: 這邊建議一種CRTP的寫法 : 先做一個pure vurtal func在 03/17 17:04
dzwei: animal的Class內。然後再做一個animal_CRTP,這個Class 03/17 17:05
dzwei: 負責實作靜態轉型為Derived。最後Cat、Dog只要繼承 03/17 17:05
dzwei: animal_CRTP<Cat>和animal_CRTP<Dog>即可 03/17 17:06
hadoop: 前提是你的compiler能過嗎? 03/19 13:26
phishingphi: 額為甚麼一個對virtual函式都不熟的問題會出現CRTP.. 03/20 01:15
dzwei: 目前在win10上 03/20 21:11
dzwei: 用gcc7 clang6 clang6-cl 03/20 21:11
dzwei: 都可以通過編譯且執行結果正確 03/20 21:11
dzwei: 目前有問題的是重載operator 03/20 21:11
s4300026: animal的func寫成=0這樣想就比較清楚了 03/21 12:23