让我们说我有:
type
TClassA = class
function prova: integer; virtual;
function provaSuA: integer; virtual;
end;
type
TClassB = class(TClassA)
function prova: integer; override;
function provaSuB: integer; virtual;
end;
然后我使用这段代码:
procedure TForm1.Button1Click(Sender: TObject);
var a: TClassA;
b: TClassB;
begin
Memo1.Clear;
a := TClassB.Create;
try
b := ?? //dynamic_cast on C++
Memo1.Lines.Add(a.prova.ToString);
Memo1.Lines.Add(b.provaSuB.ToString);
finally
a.Free;
end;
end;
我使用的是多态,a的静态类型是TClassA
,但动态类型是TClassB
。当然,我只能调用在a
上声明的TClassA
方法(或者在TClassB
中被覆盖的方法)。
如果我想使用a
并且可以访问C ++中TClassB中的ALL方法,我会在C ++ RTTI中使用dynamic_cast
(和typeid一起使用)。我怎样才能使用Delphi的RTTI来做到这一点?
Delphi“RTTI”与C ++的含义略有不同。要复制dynamic_cast
所做的事情,您需要遵循以下两种模式之一:
as
运算符来实现的,该运算符执行正确的类型检查,然后在可能的情况下转换对象。如果失败,将抛出ClassCastException
。
b:= a as TClassB;
is
操作符来实现的,该操作符严格执行关于演员表的测试。然后,您需要在成功时手动转换(在代码中查看注释):
if (a is TClassB) then
begin
// this is a cast, however, in this context, you are simply interpreting
// the memory pointed by a as a class of type ClassB. You are not using any operator.
b:= TClassB(a);
end
else
begin
// here you know that a cannot be cast to TClassB, therefore you can gracefully take
// proper action here, without catching any exception
end;