teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

間違い修正

2016/01/25 13:48

投稿

KoichiSugiyama
KoichiSugiyama

スコア3041

answer CHANGED
@@ -1,7 +1,10 @@
1
1
  > Phoneクラスを仮想関数(Virtual ShowData())にして、Workerクラスでその関数を実装する場合( ShowData())、通常のオーバーライドとどう違うのでしょうか。
2
2
 
3
3
  仮想関数を持つクラスはインスタンスを持てません。つまりPhoneクラスは別のクラスの基底クラスとなって初めて使用できるクラスになります。
4
+ (訂正)「純粋仮想関数」の間違いです。単にvirtual修飾だとインスタンス作成できますね。訂正します。オーバーライドする関数にvirtualをつけるかつけないか、という点では「つけた方が意図しない不具合に悩まされない」と思います。ただ、virtualをつけるとその分呼び出しコストがかかるのは間違いないです。
5
+
4
6
  PhoneクラスでShowData()が実装されていれば、Phoneクラスはそれだけでインスタンスを作ることができるので場面によっては単独で使用することができます。
7
+ (訂正)こちらも「純粋仮想関数」の場合です。すみません。
5
8
 
6
9
  これらはクラス設計時にどういう意図で設計されているかによって違ってきます。
7
10
 
@@ -12,5 +15,4 @@
12
15
  なので
13
16
  > 皆様は、具体的にどう使い分けているのでしょうか。
14
17
 
15
- 上記のようにクラス設計の段階で基底クラスをどう扱うか決めてあれば特に悩むこともないと思います。
16
- もし、悩むような状況になった場合、一度クラス設計を根底から見直してみることもいいかもしれません。
18
+ 上記のようにクラス設計の段階で基底クラスをどう扱うか決めてあれば特に悩むことないと思います。もし、悩むような状況になった場合、一度クラス設計を根底から見直してみることもいいかもしれません。