调用其它类虚函数调用出错,大家帮忙查查原因

zhongxd 2005-03-03 09:41:05
如题:
例:
PTest=^TTest
TTest是一个从TObject继承的类

定义虚函数:
function Test1():Boolean;virtual;

虚函数体
function TTest.Test1():Boolean;


在其它类中一个函数中调用虚函数
function OnTestVirtual():Boolean;
pTestNode:PTest;
begin
New(pTestNode);
pTestNode^.Test1();//出错

end;
...全文
103 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
beyondtkl 2005-03-04
  • 打赏
  • 举报
回复
你需要了解一下 delphi类的内存布局...

非虚拟函数 跟 虚拟函数(动态函数)都是不一样的
前者是编译时就确定 其相对地址的了
而后两面却不是(一般都是动态确定的) 你可以认为virtual 跟 dynamic 类似 只不过侧重点不同..

你就声明一个对象即可..不需要保存对象的指针..因为对象本来就是传引用的..

上面我不是说的很清楚的么..

var Tmp:TTest;
pTmp:Test;

begin

Tmp:=TChild.Create;
Tmp.test1();//正常
tTmp := tTmp; //OK
end;
caiso 2005-03-04
  • 打赏
  • 举报
回复
顶一下
Sephil 2005-03-04
  • 打赏
  • 举报
回复
不知道为什么你要给类定义指针
有必要么
caiso 2005-03-04
  • 打赏
  • 举报
回复
顶一下
zhongxd 2005-03-03
  • 打赏
  • 举报
回复
多谢,
我修改后测试
var Tmp:TTest;
pTmp:PTest;

begin

Tmp:=TChild.Create;
pTmp1:=@TChild.Create;
Tmp.test1();//正常
pTmp1^.test1();//出错
end;

请大侠再看看,还有调用非虚拟函数是正常的,为什么?麻烦解答一下,
我必须保存类指针供以后使用的,所以。。。
beyondtkl 2005-03-03
  • 打赏
  • 举报
回复
1. 有沒有實現這個函數
2. 這個函數是public得麼
3. 對象請用 Test := TTest.Creaet;
你現在只用New是不對的 因為new只分配了內存 卻沒有做更多的工作。。。
比如重要的設置 vmt dmt等等 就是在構造函數重設置的 而你根本沒有調用構造函數 所以其虛函數表根本就是亂七八糟 或者 為空的 你訪問其中的函數(虛函數) 自然錯誤
4. 不須要用對象的指針了 因為對象本來就是傳引用的了

你現在的錯誤應該是上面第三個。。再自習體會一下。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧