[問題] 請教多型的使用

看板C_and_CPP作者 (hsr336526)時間6年前 (2018/03/17 13:32), 編輯推噓5(5020)
留言25則, 8人參與, 6年前最新討論串1/1
請問關於多型的用法 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

03/17 14:15, 6年前 , 1F
等你真的試過再來問...
03/17 14:15, 1F

03/17 14:16, 6年前 , 2F
第二種用法意義不大
03/17 14:16, 2F

03/17 14:32, 6年前 , 3F
void foo(Amimal *a) { a->hello(); }
03/17 14:32, 3F

03/17 14:32, 6年前 , 4F
這種情況foo不必知道是什麼動物,只要知道它會說hello
03/17 14:32, 4F

03/17 14:33, 6年前 , 5F
可以用"它能做什麼"取代"它是什麼"
03/17 14:33, 5F

03/17 14:33, 6年前 , 6F
不同類型但行為相同的程式碼就可以重覆使用
03/17 14:33, 6F

03/17 15:21, 6年前 , 7F
你這個根本不是多型,沒宣告virtual
03/17 15:21, 7F

03/17 15:29, 6年前 , 8F
第1.如同樓上說的,沒有虛擬化函數,不算多型
03/17 15:29, 8F

03/17 15:30, 6年前 , 9F
第二,要多型的話,建立物件的方式要採用Pointer
03/17 15:30, 9F

03/17 15:31, 6年前 , 10F
e.g. Dog* a = new Dog
03/17 15:31, 10F

03/17 16:31, 6年前 , 11F
reference也可以,但沒有指標通用
03/17 16:31, 11F

03/17 16:33, 6年前 , 12F
另外,雖然virtual方法是一般意義下的多型,但C++可以
03/17 16:33, 12F

03/17 16:33, 6年前 , 13F
用CRTP來搞靜態多型,這時就可以是non-virtual
03/17 16:33, 13F

03/17 17:03, 6年前 , 14F
我記得CRTP就一定要用指標而不能Ref了。
03/17 17:03, 14F

03/17 17:04, 6年前 , 15F
這邊建議一種CRTP的寫法 : 先做一個pure vurtal func在
03/17 17:04, 15F

03/17 17:05, 6年前 , 16F
animal的Class內。然後再做一個animal_CRTP,這個Class
03/17 17:05, 16F

03/17 17:05, 6年前 , 17F
負責實作靜態轉型為Derived。最後Cat、Dog只要繼承
03/17 17:05, 17F

03/17 17:06, 6年前 , 18F
animal_CRTP<Cat>和animal_CRTP<Dog>即可
03/17 17:06, 18F

03/19 13:26, 6年前 , 19F
前提是你的compiler能過嗎?
03/19 13:26, 19F

03/20 01:15, 6年前 , 20F
額為甚麼一個對virtual函式都不熟的問題會出現CRTP..
03/20 01:15, 20F

03/20 21:11, 6年前 , 21F
目前在win10上
03/20 21:11, 21F

03/20 21:11, 6年前 , 22F
用gcc7 clang6 clang6-cl
03/20 21:11, 22F

03/20 21:11, 6年前 , 23F
都可以通過編譯且執行結果正確
03/20 21:11, 23F

03/20 21:11, 6年前 , 24F
目前有問題的是重載operator
03/20 21:11, 24F

03/21 12:23, 6年前 , 25F
animal的func寫成=0這樣想就比較清楚了
03/21 12:23, 25F
文章代碼(AID): #1QhAXuMJ (C_and_CPP)