楼主:
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这样想就比较清楚了