[問題] 請教多型的使用

作者: 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
第二種用法意義不大
作者: james732 (好人超)   2018-03-17 14:32:00
void foo(Amimal *a) { a->hello(); }這種情況foo不必知道是什麼動物,只要知道它會說hello可以用"它能做什麼"取代"它是什麼"不同類型但行為相同的程式碼就可以重覆使用
作者: loveflames (咕啾咕啾魔法陣)   2018-03-17 15:21:00
你這個根本不是多型,沒宣告virtual
作者: dzwei (Cout<< *p << \n ;)   2018-03-17 15:29:00
第1.如同樓上說的,沒有虛擬化函數,不算多型第二,要多型的話,建立物件的方式要採用Pointere.g. Dog* a = new Dog
作者: loveflames (咕啾咕啾魔法陣)   2018-03-17 16:31:00
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:00
animal的func寫成=0這樣想就比較清楚了

Links booklink

Contact Us: admin [ a t ] ucptt.com