C++ 上的虚拟相等函数

Virtual Equal Function on C++

提问人:Vero 提问时间:4/6/2022 更新时间:4/6/2022 访问量:136

问:

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

class A
{
public:
    A() = default;
    ~A() = default;

public:
    bool operator==(const A& a)
    {
        return this->equal(a);
    };

private:
    virtual bool equal(const A& other) const = 0;
};

class B : public A
{
public:
    B() = default;
    ~B() = default;

private:
    virtual bool equal(const A& other) const override
    {
        const B* b = dynamic_cast<const B*>(&other);
        if (!b)
            return false;
        
        return m_example == b->m_example;
    }

private:
    double m_example; //This is just an example data I don't need specific solution for double :)
};

目标:只有相同类型的类之间才可能相等 = B。

  1. 可以吗?
  2. 是否有标准解决方案来拥有虚拟相等运算符?
  3. 我将从 A 中继承很多(4/8 类),我怎样才能以干净的方式做到这一点,检查指针是否为 null 看起来很丑陋。

你能帮帮我吗?

C++ 运算符重载 虚拟 相等

评论

0赞 user4581301 4/6/2022
完全无关:一旦一个函数被标记,它就会保持。派生类可以省略。但请留意.virtualvirtualvirtualfinal
0赞 user4581301 4/6/2022
虚拟操作员过载是否回答了部分问题?

答:

3赞 Sam Varshavchik 4/6/2022 #1

动态演员是否丑陋是一个见仁见智的问题。这是一场无休止的辩论,但在这里并不重要。这是因为这里不需要动态强制转换。这可以通过继承来完成:


class B; // Forward declaration.

class A {

   // Same as above

private:
   virtual bool equal(const A& other) const = 0;
   virtual bool equal(const B& other) const { return false; }
};

// ... B class:

    bool equal(const A& other) const override
    {
        return other.equal(*this);
    }

    bool equal(const B &other) const override
    {        
        return m_example == other.m_example;
    }

评论

2赞 Nathan Pierson 4/6/2022
不应该在某个地方使用吗?B::equal(const A& other)other
0赞 Sam Varshavchik 4/6/2022
是的,现在修好了。
0赞 Vero 4/7/2022
非常感谢!正如我在问题中所说,我将有 8 个从 A 继承的类,我必须为每个类添加 8 个“相等”函数,每个类包括基类?或者每个类只有两个相等的函数,而基类有 8 个相等的函数?对不起,我无法概括您的代码,如果许多类继承自 A 或例如另一个类 C 继承自 B :)如果可以,请帮忙。
0赞 Sam Varshavchik 4/7/2022
为什么你认为该类需要为类实现?除了返回 ,它可能做什么,就像基类中的默认实现一样,它做同样的事情。当然不是。只有基类需要为每个子类定义 的默认实现,并且每个子类实现两个重写,一个用于自身,一个用于自身。Bequal()Cfalseequal()A
0赞 Vero 4/9/2022
先生,一切都清楚了!非常感谢!!