在子类继承父类时怎样跳过父类代码而只继承祖父类代码(可能言语有问题.....汗!!!!...进来看看可能更为清晰) ( 积分: 30 )

  • 主题发起人 主题发起人 colonel
  • 开始时间 开始时间
C

colonel

Unregistered / Unconfirmed
GUEST, unregistred user!
TA = class
protected
procedure AA:virtual;
end;

TB = class(TA)
protected
procedure AA:override
end;

TC = class(TB)
protected
procedure AA: override;
end;

procedure TB.AA;
begin
//....
inherited;
end;

procedure TC.AA;
begin
///..
inherited;/////这里在继承中怎样不继承父类TB的AA,而只继承TA的AA
end;

因为需要TC类需要继承TB类,如果不是需要我就不从TB中继承了
 
TA = class
protected
procedure AA:virtual;
end;

TB = class(TA)
protected
procedure AA:override
end;

TC = class(TB)
protected
procedure AA: override;
end;

procedure TB.AA;
begin
//....
inherited;
end;

procedure TC.AA;
begin
///..
inherited;/////这里在继承中怎样不继承父类TB的AA,而只继承TA的AA
end;

因为需要TC类需要继承TB类,如果不是需要我就不从TB中继承了
 
procedure TC.AA;
begin
inherited TA.AA;//这里在继承中不继承父类TB的AA,而只继承TA的AA
end;
 
asm
MOV EDX,VMTOFFSET AA
MOV ECX,[EAX]
MOV ECX,[ECX].vmtParent
MOV ECX,[ECX]
MOV ECX,[ECX].vmtParent
MOV ECX,[ECX]
MOV ECX,[ECX+EDX]
CALL ECX
end;
 
都不行呀,
 
是我错还是楼主懒?执手相看泪眼,竟无语凝噎!
type
TA = class
protected
procedure AA
virtual;
end;
TB = class(TA)
protected
procedure AA
override;
end;
TC = class(TB)
protected
procedure AA
override;
end;

{ TA }

procedure TA.AA;
begin
ShowMessage('TA.AA');
end;

{ TB }

procedure TB.AA;
begin
inherited;
ShowMessage('TB.AA');
end;

{ TC }

procedure TC.AA;
begin
asm
MOV EDX,VMTOFFSET AA
MOV ECX,[EAX]
MOV ECX,[ECX].vmtParent
MOV ECX,[ECX]
MOV ECX,[ECX].vmtParent
MOV ECX,[ECX]
MOV ECX,[ECX+EDX]
CALL ECX
end;
ShowMessage('TC.AA');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
C: TA;
begin
ShowMessage('C.AA开始(TB):');
C := TB.Create;
C.AA;
C.Free;

ShowMessage('C.AA开始(TC):');
C := TC.Create;
C.AA;
C.Free;
end;
 
帮你顶一下
 
:) lichengbin唔好意思呀!!是我在無只細測試
我測試時TC.AA是這樣寫的(如下代碼),所以就有出錯....但有個問題,如果在子類中真的需要先執行一些動作後都才繼承祖父类呢,如下代碼真的有出錯的呀,我對匯編不太懂,但我還是知道那段匯編是讀VMT表的:)
begin
ShowMessage('TC.AA');
asm
MOV EDX,VMTOFFSET AA
MOV ECX,[EAX]
MOV ECX,[ECX].vmtParent
MOV ECX,[ECX]
MOV ECX,[ECX].vmtParent
MOV ECX,[ECX]
MOV ECX,[ECX+EDX]
CALL ECX
end;
end;

独帅, 中的代碼不能識別TA呀
 
Ta.inherited
 
楼上说TA.inherited, inherited TA.AA的两位一定是想都没多想,想当然地就这么写了,那根本就是编译都无法通过的。[:D]

楼主:
你的情况是因为前面调用ShowMessage,返回值是放在EAX中的,这就导致EAX中已经不是方法进入时的Self对象实例指针啦,加上一句MOV EAX,Self即可。
asm
MOV EDX,VMTOFFSET AA // 虚拟方法VMT偏移量
MOV EAX,Self // 对象实例 => EAX
MOV ECX,[EAX] // 类VMT => ECX
MOV ECX,[ECX].vmtParent
MOV ECX,[ECX] // 父类VMT => ECX
MOV ECX,[ECX].vmtParent
MOV ECX,[ECX] // 祖父类VMT => ECX
MOV ECX,[ECX+EDX] // 祖父类虚拟方法地址 => ECX
CALL ECX // 方法调用
end;
 
謝謝lichengbin,現在OK了:)
 
接受答案了.
 
不好意思了,我那是C++的语法,以为Delphi也可以呢,呵呵
 
后退
顶部