C++ :使用抽象类提供对外接口

父类子类指针函数调用注意事项
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;
}

这样如果使用抽象类的指针去访问派生类定义的其他的接口的时候,就会出现“成员函数未定义”的编译问题。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AllenSun-1990

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值