回答編集履歴

1

一部修正と追記

2015/12/21 00:45

投稿

Chironian
Chironian

スコア23272

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
+