请问如何把delphi的指针从一个类型转换成另外一个类型? ( 积分: 50 )

  • 主题发起人 主题发起人 zyx0404
  • 开始时间 开始时间
Z

zyx0404

Unregistered / Unconfirmed
GUEST, unregistred user!
比如Class A, Class B,并且Class B 继承 Class A
PA是Class A的指针, PB是Class B的指针
现在定义pa : PA,我如何将pa转换成Class B的指针?
 
ClassB(pa) 不行吗?
 
var
A: TClassA;
B: TClassB;
begin
B := TClassB.Create;
A := TClassA(B);
end;
 
//类定义
TClassA = class(TForm)
public
function basic_fun() : boolean;
end;
PointerClassA = ^TClassA;

TClassB = class(TClassA)
public
function basic_fun() : boolean;
end;
PointerClassB = ^TClassB;

//参数是PointerClassA
function fun(pA : PointerClassA) : boolean;
begin
//这里我希望的是调用TClassB的basic_fun,不是TClassA的basic_fun
//怎么才可以实现呢?
pA^.basic_fun();

result := true;
end;

//这是主要程序
function main() : boolean;
var
b : TClassB;
begin
b := TClassB.create;

//传入的参数是TClassB的指针,不是PointerClassA。但是在fun函数里仍然运行的是TClassA的basic_fun
fun(@b);
end;
 
这是相当不安全的做法
父类指针的范围较小,子类的较大,一旦调用了父类不具有的成员函数,就报内存错了
 
指针转来转去很危险吧!
 
//类定义
TClassA = class(TForm)
public
function basic_fun() : boolean; virtual;
end;

TClassB = class(TClassA)
public
function basic_fun() : boolean; override;
end;

//参数是PointerClassA
function fun(A : TClassA) : boolean;
begin
//这里我希望的是调用TClassB的basic_fun,不是TClassA的basic_fun
//怎么才可以实现呢?
A.basic_fun();

result := true;
end;

//这是主要程序
function main() : boolean;
var
b : TClassB;
begin
b := TClassB.create;

//传入的参数是TClassB的指针,不是PointerClassA。但是在fun函数里仍然运行的是TClassA的basic_fun
fun(b);
end;
 
认真咀嚼一下多态吧
 
b:TClassA;
这样定义的b本来就是指针。
PointerClassA = ^TClassA;
多此一举
 
to LoveShanShan:定义没有什么错,a:TClassA中a是指向TClassA对象实体数据块的指针,PointerClassA = ^TClassA; PointerClassA 是指向TClassA对象实体数据块的指针的指针,概念不同。
 
接受答案了.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
913
SUNSTONE的Delphi笔记
S
后退
顶部