回答編集履歴
1
一部修正と追記
test
CHANGED
@@ -1,3 +1,41 @@
|
|
1
|
-
すいません、
|
1
|
+
すいません、取り急ぎリンクだけ。
|
2
2
|
|
3
3
|
[ここ](http://pg-torch-ic.jugem.jp/?eid=10)が分かりやすかったです。
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
---
|
8
|
+
|
9
|
+
【追記】
|
10
|
+
|
11
|
+
virtualをつけるとその関数への`ポインタA`が、クラスの隠しメンバ変数としてこっそり追加されます。
|
12
|
+
|
13
|
+
具体的には下記のようになります。
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
```
|
18
|
+
|
19
|
+
HumanクラスのポインタAには、void speak(){ printf("I am human.\n"); }へのポインタ
|
20
|
+
|
21
|
+
Girl クラスのポインタAには、void speak(){ printf("I am girl.\n"); } へのポインタ
|
22
|
+
|
23
|
+
Boy クラスのポインタAには、void speak(){ printf("I am Boy.\n"); } へのポインタ
|
24
|
+
|
25
|
+
```
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
そして、ptr=&alice;の時、ptrはGirlクラスのインスタンスを指しているため、
|
30
|
+
|
31
|
+
そのポインタAには`void speak(){ printf("I am girl.\n"); }`へのポインタが入ってます。
|
32
|
+
|
33
|
+
従って、ptr->speak();を呼び出すと、`void speak(){ printf("I am girl.\n"); }`が呼ばれます。
|
34
|
+
|
35
|
+
bobの場合も同様なのです。
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
なお、仮想関数は複数存在できるので、隠し関数ポインタは配列として実装され、vtableと呼ばれています。
|
40
|
+
|
41
|
+
|