C++的继承问题请教

该账号已经存在 2015-12-03 09:10:23
最近在写一个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吗?
...全文
188 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leckun 2015-12-10
  • 打赏
  • 举报
回复
把父类的 void ReceiveASDU42(COMCONTROL* pCC,BYTE* pData);前面加个 virtual即可
  • 打赏
  • 举报
回复
基类中fun1解析的数据存放在基类开辟的私有private数组,然后子类调用基类fun1函数解析自己的数据应该存在子类自己private的数组中。就是要实现这个功能。 开始基类,子类数组都定义成public的也是一样。 父类自己的的函数可以访问自己的所有成员。子类public继承父类,子类重新定义和父类相同名private的数组,子类再调用父类的fun1不是就只能访问自己的变量和父类 public吗,应该访问不到父类的private才对吧请教了
lm_whales 2015-12-06
  • 打赏
  • 举报
回复
哈哈,不是这个样子的, 子类只能隐藏父类的变量, 但用父类指针调用函数的时候, 只有父类的虚函数,子类也实现了, 才会调用,子类的虚函数, 你这样做,不能实现代码复用, 不能达到子类用子类的同名变量, 父类用父类的这样一个目的, 因为有虚函数,没有虚成员变量, 至少没有程序员可以定义的虚成员变量。
Pokeeeer 2015-12-04
  • 打赏
  • 举报
回复
代码没太仔细看 不过根据你说的,我可不可以这样理解 你在基类中解析到的数据存到某个数组里,再去子类中创建一个数组保存基类中数组的数据? 如果是这样,那么为什么你基类中创建的数组都是私有的?
  • 打赏
  • 举报
回复

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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