仮想関数とは、定義のない関数で子クラスが実際に定義して使う関数です。

Class Oya
Public
Virtual Sub V()'仮想関数は定義不可
Sub X()
Print "Oya::X"
End Sub
End Class

Class Ko
Inherits Oya
Public
Sub V()
Print "Ko::V"
End Sub
End Class

#N88BASIC

Dim k As Ko, o As Oya

k.X()
k.V()

o.X()
o.V()'アクセス違反で落ちる!
ABではVirtualという言葉でその関数が「継承して使ってください!」という意思表示になります。

これでクラスの作り方のお話は終わりです。

ここですこし知っておいて欲しいことがあります。
ABの普通のメンバ関数はC++でいう仮想関数で、
ABでいう仮想関数ははC++でいう純粋仮想関数と呼ばれています。

上のプログはコンパイルエラーになるのが望ましい動作でした。
仮想関数を含むクラスでオブジェクトの宣言を許すなんて意外でした。

ABにはコピーコンストラクタやオペレーターオーバーロードが無いようです。
よって次のようなことをするとエライ目に合います。
これはコンストラクタで内部にメモリを確保しデストラクタで解放するものですが、
残念ながら代入するaのpの指すものは行方不明になり、
aのpとbのpは同じアドレスを指すのでデストラクタでアクセス違反になります。
デストラクタでp=0をすればアクセス違反になりませんが、いずれにせよメモリリークの原因となります。

Class Aloc
Private
p As *Byte
Public
Sub Aloc()
p = malloc(100)
End Sub
Sub ~Aloc()
free(p)
End Sub
Sub PutAddr()
Print Hex$(p)
End Sub
End Class

#N88BASIC
Dim a As Aloc, b As Aloc



a.PutAddr()
b.PutAddr()'2つは違うアドレスを指す

a = b'代入

a.PutAddr()
b.PutAddr()'2つは同じアドレスを指す

'デストラクタで落ちる...

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2010年06月07日 12:20