C++ 子类转父类 父类确定子类

//父类有多个子类,子类强制转换为父类,根据子类在父类中的共有信息确定
//被强制转换的是哪个子类
#pragma once
#include<iostream>
#include<fstream>
using namespace std;
const int nBuffSize=1024;
#define MAX_FILE_DIR_LENGTH 256 
//各种消息的宏定义
#define INVALID_MESSAGE -1     //无效的消息      
#define MSG_FILE_NAME   1        //表示收发的是文件名
#define MSG_FILE_LENGTH 2        //表示收发的是文件长度

class CCMsg
{
public:
	struct TMsgParent      //父消息
    {
	  int msgID;
	  TMsgParent(int msg=INVALID_MESSAGE):msgID(msg){}    //重点信息********************************
    };
    struct TMsgFileName:public TMsgParent       //文件名数据包
    {
	   char fileName[MAX_FILE_DIR_LENGTH];
	   TMsgFileName():TMsgParent(MSG_FILE_NAME){}       //重点信息**********************
    };
	struct TMsgFileLength:public TMsgParent     //文件大小数据包
	{
		long fileLength;
		TMsgFileLength():TMsgParent(MSG_FILE_LENGTH){}
	};
};
//----------------------------------------------------------------------
	//利用socket传输一个TMSG_FILELENGTH类型的结构体
	 CCSDef::TMSG_FILELENGTH tMsgFileLength(g_lLength);
   ::send(sClient, (char*)(&tMsgFileLength), sizeof(CCSDef::TMSG_FILELENGTH), 0);
//---------------------------------------------------------------------
// 将传输来的信息强制转换为父结构体,根据父结构体的标识符来识别传输来的是哪个子结构体
   CCSDef::TMSG_HEADER *pMsgHeader;        //重点信息******************************
   int nRecv = ::recv(g_sClient, g_szBuff, MAX_PACKET_SIZE + 1, 0);
   pMsgHeader = (CCSDef::TMSG_HEADER*)g_szBuff;
   switch (pMsgHeader->cMsgID)       //重点信息*******************************
   {
     
     case MSG_FILELENGTH:    // 文件的长度
    {
        if (0 == g_lLength)
        {
           g_lLength = ((CCSDef::TMSG_FILELENGTH*)pMsgHeader)->lLength;
           printf("File Length: %d
", g_lLength);
        }
    }
    break;
     case MSG_FILENAME:     // 文件名
    {
       return AllocateMemoryForFile(pMsgHeader);
    }
     break;
   }

原文地址:https://www.cnblogs.com/zztong/p/6695197.html