【问题标题】:Subclass object as a parameter to a virtual function子类对象作为虚函数的参数
【发布时间】:2014-04-14 11:00:12
【问题描述】:

好的,所以基本上我在另一个类中使用了一个类,除其他外,它要求对象报告它与另一个相同类型的对象的关系。效果很好。仅供参考,此类表示协议。不幸的是,现在我试图通过添加一个名为 Wrapper 的类来装饰类关系。这个类的主要功能是它可以将第一个类作为参数(或任何其他相同的)。:

template< class InnerInterpreter >
class WrapperInterpreter
{
public:
    WrapperInterpreter(const InnerInterpreter &m) : innerMessage(m) {}

    ...

    virtual bool respondsToMessage(const WrapperInterpreter<InnerInterpreter> &) const = 0;

public:
    //member
    InnerInterpreter innerMessage;
};

出于其他设计原因,我得出的结论是,将其作为一组包装器的基类(而不是将两个不同的协议作为参数)允许我使用一组外部和内部协议类。

所以这是我的问题:当我尝试继承 WrapperInterpreter&lt;&gt;,特别是提供 respondsToMessage() 的实现时,我最终得到了一个能够与WrapperInterpreter 层次结构。但这实际上不是我想要做的。我想做的是强制子类实现一个方法:

template< class Inner >
class ConcreteWrapper : WrapperInterpreter<Inner>
{
    ...
    bool respondsToMessage(const ConcreteWrapper<Inner> &);
    ...
}

我立即想到的一个解决方案是简单地将其从WrapperInterpreter 的接口中删除,并且仅在与设计的其余部分一起使用时让编译器抱怨缺少的接口方法。

所以我的问题是有没有办法将方法放在抽象类的接口中,使得子类必须将子类类型的对象作为参数? em>

或者,我是否试图错误地使用继承?有没有人有任何有用的设计模式可以帮助我解决这个问题?

【问题讨论】:

    标签: c++ templates inheritance polymorphism virtual-functions


    【解决方案1】:

    有一种称为 CRTP(Curiously Recurring Template Pattern)的设计,它包括将 Child 的类型作为模板参数传递给 Parent

    template <typename Child>
    class WrapperInterpreter {
        using Inner = typename Child::Inner; // nested typedef
    
        WrapperInterpreter(Inner const& ...);
    
        virtual bool respondsToMessage(Child const& ...) = 0;
    };
    
    template <typename Inner>
    class Concrete: public WrapperInterpreter< Concrete<Inner> > {
    
        virtual bool respondsToMessage(Concrete const& ...) override;
    
    };
    

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 2014-07-12
      相关资源
      最近更新 更多