父类子类指针函数调用注意事项
1,如果以一个基础类指针指向一个衍生类对象(派生类对象),那么经由该指针只能访问基础类定义的函数(静态联翩)
2,如果以一个衍生类指针指向一个基础类对象,必须先做强制转型动作(explicit cast),这种做法很危险,也不符合生活习惯,在程序设计上也会给程序员带来困扰。(一般不会这么去定义)
注意包含纯虚函数的抽象类无法实例化。
使用举例:
namespace diagclient
{
class CDiagClienteExInterface
{
public:
virtual void init(void) = 0;
virtual void deinit(void) = 0;
virtual void RegReadDTCCallback(ReadDTCCallback function) = 0;
virtual void RegReadAllDTCsCallback(ReadAllDTCsCallback function) = 0;
virtual void RegDTCReceiveCallback(DTCReceiveCallback function) = 0;
virtual void RegClearDTCCallback(ClearDTCCallback function) = 0;
virtual bool ReadDTC(DTC_Code_ST id) = 0; //GM Read DTC
virtual bool ReadAllDTCs() = 0; //GM Read All DTCs
virtual bool ClearDTC() = 0; //GM Clear DTC
virtual bool RegisterFaultMonitor(DTC_Code_ST id) = 0; //GM Register Fault Monitor
virtual bool UnRegisterFaultMonitor(DTC_Code_ST id) = 0; //GM UnRegister Fault Monitor
virtual bool SetTestResult(FAULT_EVENT_ID eventID, EVENT_STATUS_T evtStatus) = 0;
};
}
extern diagclient::CDiagClienteExInterface* CreateCDiagClienteExInterface();
extern void DeleteCDiagClienteExInterface(diagclient::CDiagClienteExInterface* interface);
namespace diagclient
{
class CDiagClientInterface : public CDiagClienteExInterface
{
public:
CDiagClientInterface();
virtual ~CDiagClientInterface();
void init(void);
void deinit(void);
void onMessageDispatcher(uint32_t id, void *message, uint32_t length, uint32_t uid);
virtual void RegReadDTCCallback(ReadDTCCallback function);
virtual void RegReadAllDTCsCallback(ReadAllDTCsCallback function);
virtual void RegDTCReceiveCallback(DTCReceiveCallback function);
virtual void RegClearDTCCallback(ClearDTCCallback function);
virtual bool ReadDTC(DTC_Code_ST id); //GM Read DTC
virtual bool ReadAllDTCs(); //GM Read All DTCs
virtual bool ClearDTC(); //GM Clear DTC
virtual bool RegisterFaultMonitor(DTC_Code_ST id); //GM Register Fault Monitor
virtual bool UnRegisterFaultMonitor(DTC_Code_ST id); //GM UnRegister Fault Monitor
virtual bool SetTestResult(FAULT_EVENT_ID eventID, EVENT_STATUS_T evtStatus);
public:
virtual bool ReadDTCReturn(void *message, uint32_t length); //Read DTC feedback
virtual bool ReadAllDTCsReturn(void *message, uint32_t length); //Read All DTCs feedback
virtual bool ClearDTCReturn(void *message, uint32_t length); //Clear DTC feedback
virtual bool DTCReceivedCallback(void *message, uint32_t length); //DTC status change notify
private:
bool b_init;
ReadDTCCallback m_ReadDTC;
ReadAllDTCsCallback m_ReadAllDTCs;
DTCReceiveCallback m_DTCReceive;
ClearDTCCallback m_ClearDTC;
};
}
/**** GLOBAL VARIABLES ***************************************************/
CDiagClienteExInterface* CreateCDiagClienteExInterface()
{
CDiagClientInterface* m_interface = new CDiagClientInterface;
return m_interface;
}
void DeleteCDiagClienteExInterface(CDiagClienteExInterface* m_interface)
{
delete m_interface;
}
这样如果使用抽象类的指针去访问派生类定义的其他的接口的时候,就会出现“成员函数未定义”的编译问题。