作者:
hsr336526 (hsr336526)
2018-03-17 13:32:37請問關於多型的用法
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()
這樣用法上有什麼區別呢
作者:
xam (聽說)
2018-03-17 14:15:00等你真的試過再來問...
作者:
bluesoul (å¿™æ»ä½ è€çˆ¸)
2018-03-17 14:16:00第二種用法意義不大
void foo(Amimal *a) { a->hello(); }這種情況foo不必知道是什麼動物,只要知道它會說hello可以用"它能做什麼"取代"它是什麼"不同類型但行為相同的程式碼就可以重覆使用
作者:
dzwei (Cout<< *p << \n ;)
2018-03-17 15:29:00第1.如同樓上說的,沒有虛擬化函數,不算多型第二,要多型的話,建立物件的方式要採用Pointere.g. Dog* a = new Dog
reference也可以,但沒有指標通用另外,雖然virtual方法是一般意義下的多型,但C++可以用CRTP來搞靜態多型,這時就可以是non-virtual
作者:
dzwei (Cout<< *p << \n ;)
2018-03-17 17:03:00我記得CRTP就一定要用指標而不能Ref了。這邊建議一種CRTP的寫法 : 先做一個pure vurtal func在animal的Class內。然後再做一個animal_CRTP,這個Class負責實作靜態轉型為Derived。最後Cat、Dog只要繼承animal_CRTP<Cat>和animal_CRTP<Dog>即可
作者: hadoop (elephant) 2018-03-19 13:26:00
前提是你的compiler能過嗎?
作者: phishingphi (hsnutontu) 2018-03-20 01:15:00
額為甚麼一個對virtual函式都不熟的問題會出現CRTP..
作者:
dzwei (Cout<< *p << \n ;)
2018-03-20 21:11:00目前在win10上用gcc7 clang6 clang6-cl都可以通過編譯且執行結果正確目前有問題的是重載operator
作者:
s4300026 (s4300026)
2018-03-21 12:23:00animal的func寫成=0這樣想就比較清楚了