C ++“接口”和成员方法中的派生类型参数

时间:2011-11-07 07:11:41

标签: c++ inheritance

我正在尝试做这样的事情:

class foo {
    virtual void bool operator==(foo const & rhs) = 0;
};

class bar1 : public foo {
    bool operator==(bar1 const & rhs) { ... }
};

class bar2 : public foo {
    bool operator==(bar2 const & rhs) { ... }
};

也就是说,我想指出实现foo接口的所有类必须为其自己的派生类实现operator==方法。

但是,编译器抱怨bar1和bar2仍然是抽象类,因为它们还没有实现operator==(foo const &)

我考虑过将bar1和bar2中的函数签名更改为foo const &,然后在函数内部执行dynamic_cast,但这看起来很混乱:

class bar1 : public foo {
    bool operator==(foo const & rhs) {
        const bar1 * casted_rhs = dynamic_cast<const bar1 *>(&rhs);
        if (casted_rhs == NULL) {
            // not a bar1
            return false;
        } else {
            // go through rhs and this object and find out if they're equal
        }
    }
}

这感觉很乱。

必须有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:5)

您可以使用CRTP模式来强制出现这种情况。通过这种方式,模板基类强制在派生类中实现operator==

template <typename T>
class foo {
    bool operator==(const T & rhs)
    {
        return static_cast<T>(*this).operator==(static_cast<T>(rhs));
    }
};

class bar1 : public foo<bar1> {
    bool operator==(const bar1  & rhs)
    {
    }
};

class bar2 : public foo<bar2> {
    bool operator==(const bar2 & rhs)
    {

    }
};

答案 1 :(得分:1)

那是因为你没有覆盖那些确切的方法。

class bar1 : public foo {
    bool operator==(bar1 const & rhs) { ... }
};

class bar2 : public foo {
    bool operator==(bar2 const & rhs) { ... }
};

应改为

class bar1 : public foo {
    bool operator==(foo const & rhs) { ... }
};

class bar2 : public foo {
    bool operator==(foo const & rhs) { ... }
};

你很高兴。您应该阅读有关polymorphism

的更多信息