【问题标题】:need design help using private inheritance需要使用私有继承的设计帮助
【发布时间】:2013-07-25 14:03:31
【问题描述】:

我遇到以下情况的问题:一个库(CardReader)实现了 ISO7816 协议并与智能卡(由我实现)通信。

我必须实现一个使用这个库的专有协议。

在 CardReader 中有以下类 APDURequest 和 APDUResponse。 CardReader 类实现了发送和接收这些消息的所有功能。

class APDUResonse
{
public:   
    /* ctor, copy ctor, move ctor, copy =, and move = operators. */
    //...
    int statusWord() const { return ...; }
    int sw1() const { return ...; }
    int sw2() const { return ...; }   
};

另一方面,在我的软件中,我有一个独立的层次结构来实现进出智能卡的消息。这是基类的接口:

enum class MessageResKind { /* ... */ };

class IMessageRes
{
public:
    virtual ~IMessageRes() {};
    virtual int statusWord() const = 0;
    virtual int sw1() const = 0;
    virtual int sw2() const = 0;
    virtual MessageResKind kind() const = 0;       
    virtual void print( std::ostream& ) = 0;
};

现在我的疑问是如何派生专门的类...我的第一次尝试是:

class ADMessageResATR : public IADMessageRes, private iso7816::APDUResponse
{
public:

    // import iso7816::APDUResponse ctor
    using iso7816::APDUResponse::APDUResponse;

    using iso7816::APDUResponse::sw1;
    using iso7816::APDUResponse::sw2;
    using iso7816::APDUResponse::statusWord;

    ADMessageResKind kind() const
    {
        return ADMessageResKind::ATR;
    }

    void print() const {}
};

但我编译时出现错误:无法实例化抽象类 ADMessageResATR:statusWord、sw1 和 sw2 抽象

【问题讨论】:

    标签: c++ inheritance multiple-inheritance private-inheritance


    【解决方案1】:

    不确定你想要实现什么,但如果你想公开接口并使用库实现,你可以这样做:

    class ADMessageResATR : public IADMessageRes, private iso7816::APDUResponse
    {
    public:
    
        int sw1() const {return iso7816::APDUResponse::sw1();}
    ...
    };
    

    【讨论】:

    • 我认为导入iso7816::APDUResponse函数就够了。
    • 在这种情况下 iso7816::APDUResponse 析构函数需要是虚拟的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2012-02-17
    • 2017-08-25
    • 2014-12-03
    相关资源
    最近更新 更多