子类对象作为虚函数的参数

时间:2014-04-14 11:00:13

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

好的,基本上我在另一个类中使用了一个类,除其他外,它要求对象报告它与同一类型的另一个对象的关系。效果很好。仅供参考,此类代表协议。不幸的是,现在我试图通过添加一个名为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;
};

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

所以这就是我的问题:当我尝试子类化WrapperInterpreter<>,特别是为respondsToMessage()提供实现时,我最终得到了一个子类,能够与WrapperInterpreter层次结构中的任何类进行比较。但这实际上并不是我想做的事情。我想做的是强制子类实现一个方法:

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

我立刻想到的一个解决方案是简单地从WrapperInterpreter的界面中删除它,只是让编译器在与其他设计一起使用时才会抱怨缺少的接口方法。

所以我的问题是是否有办法将方法放在抽象类的接口中,这样子类必须将子类类型的对象作为参数β

或者,我是否尝试错误地使用继承?有没有人可以帮助我解决这个问题?

1 个答案:

答案 0 :(得分:1)

有一种名为CRTP(奇怪的重复模板模式)的设计,它将 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;

};