C++ C++&引用;接口“;和成员方法中的派生类型参数

C++ C++&引用;接口“;和成员方法中的派生类型参数,c++,inheritance,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) { ... } }; 也就是说,

我正在尝试这样做:

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
接口的所有类都必须为其自己的派生类实现
操作符==
方法

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

我已经考虑过在bar1和bar2中将函数签名更改为
foo const&
,然后在函数内部执行
dynamic\u 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
        }
    }
}
类bar1:公共foo{
布尔运算符==(foo常量和rhs){
const bar1*casted_rhs=动态_cast(&rhs);
if(casted_rhs==NULL){
//不是酒吧
返回false;
}否则{
//检查rhs和这个物体,看看它们是否相等
}
}
}
这感觉很乱

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

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

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)
    {

    }
};
模板
福班{
布尔运算符==(常数T和rhs)
{
返回static_cast(*this).operator==(static_cast(rhs));
}
};
第1类:公共食品{
布尔运算符==(常数条1和rhs)
{
}
};
第2类:公共食品{
布尔运算符==(常数条2和rhs)
{
}
};

这是因为您没有覆盖那些精确的方法

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) { ... }
};

你可以走了。你应该多读关于

我不认为静态继承是适合的——有很多缺点,如<代码> BAR1和 BAR2是从不同的类派生的。这是否是通常强制接受的方式,强迫我在C++中做什么?这是一个很好的解释。你的拼写错误,应该是“==”而不是单个“=”@AndersK。是的,我知道。谢谢,这是为了解释。我读了上面的评论。但这不是一个好主意:想象一下类似于
bar1=bar2
。对于您的解决方案,这是一种编译,但不是正确的解决方案。是的,但在某些情况下,bar1=bar2是正确的方法。另外,可以通过使用对象类型的枚举来解决问题,如果对象类型不匹配,则返回false,但在这种情况下,我想您的解决方案更优雅,更“c++方式”。这就是我在问题中所写的。我说我想把函数签名改为
operator==(foo-const&)
,然后在代码内部执行
dynamic\u-cast
,以确保类型匹配。我正在寻找一个更好的解决方案。假设你说的是‘bool operator==’,那么这个解决方案对我来说似乎是正确的。我不认为多态性检查等式有什么错。另一方面,相等运算符可能是“const”方法。@juanchopanza我试图避免在文本
operator=
中显示的
operator=
代码中使用
dynamic\u cast
。。你想要哪一个?谢谢你抓到我的打字错误。我的意思是
操作符==