怎样用子类的函数代替父类的函数 想了两天也想不明白,只差那么一点点,唉....

uio45757 2002-07-20 11:20:39
#ifndef Unit12H
#define Unit12H
class TForm12 : public TForm
{
__published:
void __fastcall Table1costChange(TField *Sender);//这是一个数据库中固定字段的事件函数
...............
}
//unit12.cpp文件
void __fastcall TForm12::Table1costChange(TField *Sender)
{

Table1->Edit();
Table1total->ReadOnly=false;
Table1->FieldByName("total")->AsFloat=Table1->FieldByName("anount")->AsFloat*Table1->FieldByName("cost")->AsFloat;
Table1total->ReadOnly=true;
Table1->Post();
}


以下是;另外一个的文件,是用来继承Form12的
#ifndef Unit20H
#define Unit20H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include "Unit12.h"
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
class TForm20 : public TForm12
{
__published:
void __fastcall Table1costChange(TField *Sender);//这个事件是自己定义的,只是想,代替form12::Table1costChange(TField *Sender)
void __fastcall FormCreate(TObject *Sender);
private:

public:
__fastcall TForm20(TComponent* Owner);

};


//Unit20.cpp文件.........
void __fastcall TForm20::Table1costChange(TField *Sender)
{

TForm12::Table1->Edit();
TForm12::Table1->FieldByName("cost")->AsFloat=-TForm12::Table1->FieldByName("cost")->AsFloat;
TForm12::Table1total->ReadOnly=false;
TForm12::Table1->FieldByName("total")->AsFloat=TForm12::Table1->FieldByName("anount")->AsFloat*TForm12::Table1->FieldByName("cost")->AsFloat;
TForm12::Table1total->ReadOnly=true;
TForm12::Table1->Post();
}
void __fastcall TForm20::FormCreate(TObject *Sender)
{
TForm12::Table1costChange=Table1costChange;//走到这里就不行了就出现了
MeMber function must be called or its address taken的异常语句


}
我想做的是,怎样用Form20::Table1costChange(TField *Sender)这个事件来代替Form12::Table1costChange(TField *Sender)
简单地来说,就是,当Table1cost这个固定字段发生变化的时候,执行的是Form12::Table1costChange(TField *Sender)而不是Form20::Table1costChange(TField *Sender)
...全文
59 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
uio45757 2002-07-21
  • 打赏
  • 举报
回复
jsp大侠;你那个分明就是写控件的方法.........
uio45757 2002-07-21
  • 打赏
  • 举报
回复
谢了
01101230 2002-07-21
  • 打赏
  • 举报
回复
利用虚函数实现多态性
denglt 2002-07-20
  • 打赏
  • 举报
回复
TForm12::Table1costChange=Table1costChange;//这行代码多余。
JamesJiang 2002-07-20
  • 打赏
  • 举报
回复
To:uio45757(一条傻鱼)
兄弟,你是不是把问题讲反了?按你的说法,不在Form20中定义Table1costChange(TField *Sender)不就行了?
denglt 2002-07-20
  • 打赏
  • 举报
回复
TForm12::Table1costChange=Table1costChange;//这行代码去掉就可以了,是多余的。
kingcaiyao 2002-07-20
  • 打赏
  • 举报
回复
那你在TForm12类中可以将你的这个函数声明成:virtual (虚拟函数)
即是说:
#ifndef Unit12H
#define Unit12H
class TForm12 : public TForm
{
protected:
virtual void __fastcall Table1costChange(TField *Sender);//这是一个数据库中固定字段的事件函数
...............
}
//unit12.cpp文件
void __fastcall TForm12::Table1costChange(TField *Sender)
{

Table1->Edit();
Table1total->ReadOnly=false;
Table1->FieldByName("total")->AsFloat=Table1->FieldByName("anount")->AsFloat*Table1->FieldByName("cost")->AsFloat;
Table1total->ReadOnly=true;
Table1->Post();
}

uio45757 2002-07-20
  • 打赏
  • 举报
回复
简单地来说,就是,当Table1cost这个固定字段发生变化的时候,
在form2o这个窗体里面
执行的是Form12::Table1costChange(TField *Sender)而不是Form20::Table1costChange(TField *Sender)
jishiping 2002-07-20
  • 打赏
  • 举报
回复
在TForm12里定义一个虚拟函数,这个虚拟函数执行原来的Table1costChange
的代码,而Table1costChange里调用这个虚函数。在派生的TForm20里,重新
定义这个虚拟函数就可以了。

class TForm12 : public TForm
{
__published:
void __fastcall Table1costChange(TField *Sender);
protected:
virtual void __fastcall Table1Change(TField *Sender);
...............
};

void __fastcall TForm12::Table1costChange(TField *Sender)
{
Table1Change(Sender);
}

void __fastcall TForm12::Table1Change(TField *Sender)
{
Table1->Edit();
Table1total->ReadOnly=false;
Table1->FieldByName("total")->AsFloat=Table1->FieldByName("anount")->AsFloat*Table1->FieldByName("cost")->AsFloat;
Table1total->ReadOnly=true;
Table1->Post();
}

class TForm20 : public TForm12
{
protected:
virtual void __fastcall Table1Change(TField *Sender);
public:
__fastcall TForm20(TComponent* Owner);
};

//Unit20.cpp文件.........
void __fastcall TForm20::Table1Change(TField *Sender)
{

TForm12::Table1->Edit();
TForm12::Table1->FieldByName("cost")->AsFloat=-TForm12::Table1->FieldByName("cost")->AsFloat;
TForm12::Table1total->ReadOnly=false;
TForm12::Table1->FieldByName("total")->AsFloat=TForm12::Table1->FieldByName("anount")->AsFloat*TForm12::Table1->FieldByName("cost")->AsFloat;
TForm12::Table1total->ReadOnly=true;
TForm12::Table1->Post();
}
JamesJiang 2002-07-20
  • 打赏
  • 举报
回复
在TForm20::TablecostChange里面第一行调用
TForm12::TableconstChange(Sender);
子类通过位域符直接调用父类的同名成员函数。
uio45757 2002-07-20
  • 打赏
  • 举报
回复
to
kingcaiyao(AKing)
我的那个TForm12::Table1costChange是我从Table1cost里单击那个Change事件产生的,我又怎能让他成为protected:virtual啊???
呵呵,是我说得不清楚
to JamesJiang(欢乐英雄)
如果我像你这么做的话,那么当我单击table1cost时,响应的还是那个TForm12::Table1costChange而不是我自己定义的TForm20::Table1costChange

因为,你都看见啦,那个Table1cost是在Form12里的

请大家多点发言,先谢了

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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