作者hsr336526 (hsr336526)
看板C_and_CPP
標題[問題] 請教多型的使用
時間Sat Mar 17 13:32:37 2018
請問關於多型的用法
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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1521264760.A.593.html
1F:→ xam: 等你真的試過再來問... 03/17 14:15
2F:推 bluesoul: 第二種用法意義不大 03/17 14:16
3F:→ james732: void foo(Amimal *a) { a->hello(); } 03/17 14:32
4F:→ james732: 這種情況foo不必知道是什麼動物,只要知道它會說hello 03/17 14:32
5F:→ james732: 可以用"它能做什麼"取代"它是什麼" 03/17 14:33
6F:→ james732: 不同類型但行為相同的程式碼就可以重覆使用 03/17 14:33
7F:→ loveflames: 你這個根本不是多型,沒宣告virtual 03/17 15:21
8F:推 dzwei: 第1.如同樓上說的,沒有虛擬化函數,不算多型 03/17 15:29
9F:→ dzwei: 第二,要多型的話,建立物件的方式要採用Pointer 03/17 15:30
10F:→ dzwei: e.g. Dog* a = new Dog 03/17 15:31
11F:→ loveflames: reference也可以,但沒有指標通用 03/17 16:31
12F:→ loveflames: 另外,雖然virtual方法是一般意義下的多型,但C++可以 03/17 16:33
13F:→ loveflames: 用CRTP來搞靜態多型,這時就可以是non-virtual 03/17 16:33
14F:→ dzwei: 我記得CRTP就一定要用指標而不能Ref了。 03/17 17:03
15F:→ dzwei: 這邊建議一種CRTP的寫法 : 先做一個pure vurtal func在 03/17 17:04
16F:→ dzwei: animal的Class內。然後再做一個animal_CRTP,這個Class 03/17 17:05
17F:→ dzwei: 負責實作靜態轉型為Derived。最後Cat、Dog只要繼承 03/17 17:05
18F:→ dzwei: animal_CRTP<Cat>和animal_CRTP<Dog>即可 03/17 17:06
19F:推 hadoop: 前提是你的compiler能過嗎? 03/19 13:26
20F:→ phishingphi: 額為甚麼一個對virtual函式都不熟的問題會出現CRTP.. 03/20 01:15
21F:推 dzwei: 目前在win10上 03/20 21:11
22F:→ dzwei: 用gcc7 clang6 clang6-cl 03/20 21:11
23F:→ dzwei: 都可以通過編譯且執行結果正確 03/20 21:11
24F:→ dzwei: 目前有問題的是重載operator 03/20 21:11
25F:推 s4300026: animal的func寫成=0這樣想就比較清楚了 03/21 12:23