C++的继承问题请教
最近在写一个DLL驱动时,有两个设备采用都是103协议,解析方式都是一样只有配置点表不一样。于是我就先写好一个型号的类和所有函数实现。
再写第二个类时我就想到解析方式都是一样的那么只要只要调用前1个类函数来解析就好,数组存入当前类开辟数组空间就好。于是我这样做了,但是程序一跑就死了,进入调试发现this指针怎么是指向的父类,不是指向当前子类.问题在哪里在哪里????????????????
CSF206_L是我实现的第一个类,当然他也有也是继承自MyUniter的基类。
然后我写了我的第二个类CSF206_GB,他继承CSF206_L.当然就是想用他的解析函数来为自己服务。
贴上部分代码,烦请明白人指点一二!!!!!!!!!!!!
#ifndef CSF206_L_H
#define CSF206_L_H
#include "stdafx.h"
#include <afxdllx.h>
#include "E:\SCADANT\DLLEXE\public\public.h"
class myCUnitCSF206_L:public myCUnitMeter
{
protected:
DECLARE_DYNCREATE(myCUnitCSF206_L);
myCUnitCSF206_L();
virtual ~myCUnitCSF206_L();
private:
DWORD m_dwClockFlag;
DWORD m_dwClockData;
DWORD m_dwClockDD;
DWORD m_dwClockYC;
myCDataAnalog* m_pYC[22];
myCDataSwitch* m_pYX[75];
myCDataEnergy* m_pEnergy[4];
myCDataOperateYKYT* m_pYK[4];
myCDataOperate* m_pReset;
virtual BOOL OnCreate(void);
virtual void OnPortOpen(myCPort* pPort);
// virtual void ExeSynTime(COMCONTROL* pCC,time_t time,WORD wMilliSecond);
virtual void ExchangeComData(COMCONTROL* pCC);
public:
BYTE m_all,m_nSCN;
BYTE Flag_Readcom;
BYTE m_nStart;
BYTE m_nFirst;
BOOL m_bASDU9Label;
virtual CString ExeOperate(COMCONTROL* pCC,BYTE NUM,BYTE Data);
bool ReadComData(COMCONTROL* pCC);
BYTE GetmyAddSum(BYTE* pData,int nLength,BYTE Label);
void myCUnitCSF206_L::ResetUnit(COMCONTROL* pCC);
void myCUnitCSF206_L::CallFirstData(COMCONTROL* pCC);
void myCUnitCSF206_L::SendASDU6(COMCONTROL* pCC);
void SendASDU7(COMCONTROL* pCC);
void SendASDU10(COMCONTROL* pCC,unsigned char Fun,unsigned char Group,unsigned char FunCode,unsigned char GroupCode,unsigned char GIDCode);
void SendASDU21(COMCONTROL* pCC,unsigned char GIN,unsigned char Group);
void ReceiveASDU42(COMCONTROL* pCC,BYTE* pData);
// float ConvertlIEEE754ToDex(unsigned long IEEdata);
float ConvertlIEEE754ToDex(unsigned long IEEdata);
};
class myCUnitCSF206_GB :public myCUnitCSF206_L
{
protected:
DECLARE_DYNCREATE(myCUnitCSF206_GB);
myCUnitCSF206_GB();
virtual ~myCUnitCSF206_GB();
protected:
DWORD m_dwClockFlag;
DWORD m_dwClockData;
DWORD m_dwClockDD;
DWORD m_dwClockYC;
myCDataAnalog* m_pYC[22];
myCDataSwitch* m_pYX[93];
myCDataEnergy* m_pEnergy[4];
myCDataOperateYKYT* m_pYK[4];
myCDataOperate* m_pReset;
public:
virtual BOOL OnCreate(void);
virtual void OnPortOpen(myCPort* pPort);
virtual void ExchangeComData(COMCONTROL* pCC);
};
#endif
#include "CSF206_L.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE CSF206_LDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("CSF206_L.DLL Initializing!\n");
if (!AfxInitExtensionModule(CSF206_LDLL, hInstance))
return 0;
new CDynLinkLibrary(CSF206_LDLL);
myCUnit::RegisterClass("四方华能","CSF206_L",RUNTIME_CLASS(myCUnitCSF206_L));
myCUnit::RegisterClass("四方华能","CSF206_GB",RUNTIME_CLASS(myCUnitCSF206_GB));
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("CSF206_L.DLL Terminating!\n");
AfxTermExtensionModule(CSF206_LDLL);
}
return 1;
}
IMPLEMENT_DYNCREATE(myCUnitCSF206_L, myCUnitMeter);
//初始化
myCUnitCSF206_L::myCUnitCSF206_L():myCUnitMeter()
{
m_address.bValidDest = TRUE;//目的地值有效
m_address.dwMinAddressDest = 1;
m_address.dwMaxAddressDest = 0x7e;
m_address.dwAddressDest = 1;
m_dwClockFlag = 0;
m_dwClockData = 0;
m_dwClockDD = 0;
m_dwClockYC = 0;
m_all=0x70;
m_nStart =1;
m_nFirst =0;
Flag_Readcom=0;
//m_bASDU9Label=true;
}
myCUnitCSF206_L::~myCUnitCSF206_L()
{
}
BOOL myCUnitCSF206_L::OnCreate(void)
{
//这里就是创建数据
}
//函数功能:在通讯口打开时,得到所有数据实例指针
// 由通信管理器在OpenAllPort中调用
//参数:通讯口指针pPort
//返回值:空
void myCUnitCSF206_L::OnPortOpen(myCPort* pPort)
{
for(int i=0;i<22;i++)
{
CString str;
str.Format("Analog%d",i+1);
m_pYC[i]=(myCDataAnalog*)GetData(str);
}
for(int j=0;j<75;j++)
{
CString str;
str.Format("IN%d",j+1);
m_pYX[j]=(myCDataSwitch*)GetData(str);
}
for(int k=0;k<4;k++)
{
CString str;
str.Format("Energy%d",k+1);
m_pEnergy[k]=(myCDataEnergy*)GetData(str);
}
m_pYK[0]=(myCDataOperateYKYT*)GetData("YK1");
m_pYK[1]=(myCDataOperateYKYT*)GetData("YK2");
m_pYK[2]=(myCDataOperateYKYT*)GetData("YK3");
m_pYK[3]=(myCDataOperateYKYT*)GetData("YK4");
m_pReset=(myCDataOperate*)GetData("Reset");
}
//////////中间就是实现CSF206-L的各个函数,就不一一列出了。
void myCUnitCSF206_L::ReceiveASDU42(COMCONTROL* pCC,BYTE* pData)//解析开关量状态
{
//计算本组全遥信个数
unsigned int i,count,start;
count=pData[1]-9;
start=pData[11];
pData=pData+12;
for(i=0;i<count;i++)
{
if(pData[i]==0x01)
if(m_pYX[i+1-start]) m_pYX[i+1-start]->FreshData(0x00);
if(pData[i]==0x02)
if(m_pYX[i+1-start]) m_pYX[i+1-start]->FreshData(0x01);
}
}
//////////////下面是我写的第二个类的构造函数等
IMPLEMENT_DYNCREATE(myCUnitCSF206_GB, myCUnitCSF206_L);
//初始化
myCUnitCSF206_GB::myCUnitCSF206_GB():myCUnitCSF206_L()
{
m_address.bValidDest = TRUE;//目的地值有效
m_address.dwMinAddressDest = 1;
m_address.dwMaxAddressDest = 0x7e;
m_address.dwAddressDest = 1;
m_dwClockFlag = 0;
m_dwClockData = 0;
m_dwClockDD = 0;
m_dwClockYC = 0;
m_all=0x70;
m_nStart =1;
m_nFirst =0;
Flag_Readcom=0;
//m_bASDU9Label=true;
}
myCUnitCSF206_GB::~myCUnitCSF206_GB()
{
}
BOOL myCUnitCSF206_GB::OnCreate(void)
{
///创建了94个Yx数据等
}
///关联数据函数
///////////所有的报文交换都是在这个函数里实现的,当实际个CSF206_GB设备通讯时上来了一帧数据需要到Receive42()这个函数里解析处理,把报文值写到CSF206_GB开辟的数据空间里去
void myCUnitCSF206_GB::ExchangeComData(COMCONTROL* pCC)
{
if(Flag_Readcom > 5)
{
if(m_pYX[92]) m_pYX[92]->FreshData(0x01);
}
else
{
if(m_pYX[92]) m_pYX[92]->FreshData(0x00);
}
for(int i=0;i<4;i++)
{
if(m_pYK[i] && m_pYK[i]->GetOperateCode())
{
BYTE Data = m_pYK[i]->GetOperateCode();
CString strErrorMessage = ExeOperate(pCC,i,Data);
m_pYK[i]->EndOperate(strErrorMessage);
// m_dwClockData_1 =0;
}
}
//以下是接收数据
if(m_nStart)
{
ResetUnit(pCC);
}
if(m_nFirst)
{
CallFirstData(pCC);
}
//1分钟总招刷一次遥信
if(m_dwClockData+1000<=g_dwClock100ms)
{
m_dwClockData=g_dwClock100ms;
SendASDU7(pCC);
}
// 召唤全遥测数据ASDU21
if(m_dwClockYC+50<=g_dwClock100ms)
{
m_dwClockYC=g_dwClock100ms;
SendASDU21(pCC,0x01,0x01);
}
// 召唤全电度数据
if(m_dwClockDD+200<=g_dwClock100ms)
{
m_dwClockDD = g_dwClock100ms;
SendASDU21(pCC,0x02,0x01);
SendASDU6(pCC);
}
}
实际运行就报错了然后跟踪调试到VC里
为什么指向的是CSF206_L,现在的实例化对象不是CSF206_GB吗?