[问题] 请教多型的使用

楼主: 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