仮想メソッドを呼び出すには?

解決


keita1987  2014-08-11 10:36:02  No: 46608

Winndows8.1 + Delphi7, Delphi XE6

どうかご教授願います。

Unit1からUnit2の仮想メソッドを呼び出しているのですが、コンパイルは通りますが、実行時に EAccessViolationが発生してしまいます。
仮想メソッドを通常のメソッドにすると実行時エラーは出ません。
どこがおかしいのでしょうか?

よろしくお願いします。

----Unit1.pas-----------------------------------------------------------------------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
  //Unit2;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    //FT2: T2Child;
  end;

var
  Form1: TForm1;

implementation
uses
  Unit2;
var
  FT2: T2Child;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(FT2.GetF);
end;
end.

----Unit2.pas-----------------------------------------------------------------------
unit Unit2;

interface

type
  T2 = class
  protected
    function GetF: string; virtual; abstract;
  end;

type
  T2Child = class(T2)
  public
    function GetF: string; override;
  end;

implementation

{ T2 }
function T2Child.GetF: string;
begin
  Result := 'T2Child !!!';
end;
end.


au  2014-08-11 17:51:38  No: 46609

FT2に格納されるT2ChildがどこでもCreateされてないようですが。
ShowMessageするまえにCreateしたら大丈夫なんじゃないでしょうか


igy  2014-08-11 17:53:37  No: 46610

ちなみに、
  FT2 := T2Child.Create;
は?


keita1987  2014-08-11 18:06:25  No: 46611

auさん、igyさん返信ありがとうございます。

Createしていませんでした。
Createしたら問題なく動作しました。
ありがとうございます。


keita1987  2014-08-11 18:10:04  No: 46612

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加