作者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/cn.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