はじめに
C#やC++といったプログラミング言語には仮想関数(仮想メソッド)と呼ばれる機能が用意されています。
仮想関数を利用すると、基底クラスの関数の挙動を派生クラスで書き換えるといったことが可能になります。
参考: 関数のオーバーライド
「仮想」関数?
この仮想関数ですが、なぜ **「仮想」**関数という名前なのでしょうか?
気になってググってみたのですが、全くヒットしません。
そこで、「仮想関数」という名前について考察してみました。
【仮想】の意味
「実際には無いが、仮にあるものと考えてみること」
参考: 仮想(かそう)の意味 - goo国語辞書
「仮想」関数という言葉の意味
つまりこういうことでしょうか。
派生クラスで定義する想定の関数を **「仮にあるもの」**として考え、基底クラスに関数をあらかじめ持たせておく。
仮想関数の例
C# の仮想関数を例に見てみます。
以下のような仮想関数Hogeを定義してみます。
public class A
{
protected virtual void Hoge()
{
}
}
そして派生クラスを書いて仮想関数Hogeをオーバーライドしてみます。
public class B : A
{
protected override void Hoge()
{
}
}
クラスAのメソッドHoge()の頭にvirtualを付けることによって
「派生先のクラスでもHogeというメソッドが作られる想定ですよ」
という意図を込める事ができるのではないでしょうか。
つまり、仮想関数を定義することによって
「同名の関数が派生先のクラスでも仮にあるもの(=仮想である)として考えることができる」
「仮にある」と想定される関数だから仮想関数。
純粋仮想関数の名前の意味も考えてみる
C#には抽象メソッド(C++では純粋仮想関数と呼ばれる)機能も用意されています
純粋仮想関数は「実装がなく、プロトタイプが宣言されているだけの関数」です。
「純粋」仮想関数?
この純粋仮想関数ですが、なぜ**「純粋」**仮想関数という名前なのか。
これも考察してみました。
【純粋】の意味
雑多なものが混じっていないこと
仮想関数と純粋仮想関数の違い
ここで、仮想関数と純粋仮想関数を比較してみます。
仮想関数
仮想関数は以下のような記述になります。
public class A
{
protected int x;
// 仮想関数
protected virtual void Hoge()
{
x = 114514;
}
}
Hogeの定義とHogeの実装が一緒に行われています。
つまり、雑多なものが混じっていると言えます。
純粋仮想関数
これに対し、純粋仮想関数は以下のような記述になります。
public abstract class A
{
protected int x;
// 純粋仮想関数
protected abstract void Hoge();
}
Hogeの定義のみが行われています。 つまり雑多なものが混じっていない(=純粋)と言えます。
「純粋」仮想関数という言葉の意味
純粋仮想関数は関数の定義だけを行う(=雑多なものが混じっていない)関数だから
純粋仮想関数なのでしょうか。
まとめ
・仮想関数の**「仮想」には派生先のクラスに同名メソッドが仮にあるもの**(=仮想)とする意味合いがある。
・純粋仮想関数の**「純粋」には雑多なものが混じっていない**(=関数の定義だけを行う)という意味合いがある。