【问题标题】:C++ - Operator overloading and inheritanceC++ - 运算符重载和继承
【发布时间】:2017-01-22 12:45:47
【问题描述】:

我在运算符重载和继承方面需要帮助。

class A {
public:
    virtual bool operator==(const A& a);
};

class B : public A {
public:
    bool operator==(const B& b) { ... }
};

我希望能够做这样的事情。问题在于操作员的参数。我希望只能在 B 类中获得 B,但由于最初的超载,我不能。我该如何解决?

【问题讨论】:

  • “我希望能够做这样的事情。” - 这本身就是一个问题。你为什么需要这个?基本上导致了双重调度的问题;即,所需的函数实现不再取决于 one 而是 *two 对象的动态类型。就开发复杂性而言,要做到这一点会付出很多代价,而收益却很少。如果我是你,我会完全删除操作员。
  • 如果您不想将AB 进行比较,为什么A 首先提供了虚拟operator==()
  • 我希望能够拥有A的列表,并且能够对B和C进行操作。
  • @Znatte:如果您比较两个As,您是否关心对象的BC 部分?

标签: c++ inheritance operator-overloading


【解决方案1】:

运算符只是函数,因此您的问题与它们无关。您在这里想要的称为多次调度(在这种特殊情况下,正如 Christian 正确提到的那样,双重调度)。在实现和运行时复杂性方面有多种方法,包括需要语言支持的方法(例如,参见虚函数参数和 Bjarne Stroustrup 的相应论文)。

如果您想在核心 C++ 中执行此操作,欢迎您查看我的通用实现并复制所需内容: https://ideone.com/uGue2K

代码用法:

// C inherits from A, both have a static initializer that registers them and their base class(es)

struct print : Visitor2<A>
{
    // Feel free to change the return type, but keep it consistent.
    // Alternatively, you can call a lambda with the result.
    static void v1(const A& a1, const A& a2, int i, int j)
    {
        std::cout << "A, A: "<< a1() << a2() << " " << i << " " << j << std::endl;
    }

    static void v2(const C& c1, const A& a2, int i, int j)
    {
        std::cout << "C, A: "<< c1() << a2() << " " << i << " " << j <<  std::endl;
    }

    // and so on...

    print(int k_)
    : k(k_)
    {
        add_visitor( v1, v2 /* ... */ );
    }

    auto operator[](const A& a) { /* see in code */ };
};

int main()
{
    print p(4); // p takes virtual A&, virtual A&, int, int.

    const A& a = A();
    const A& b = B();

    p[a][a](1, 2);
    p[c][a](2, 3);
}

欢迎对代码和模式提出建议。为了更容易跟踪,访问者的operator[](const A&amp;) 是就地实现的,但也可以完全在Visitor2&lt;A&gt; 中完成。

请注意,您不能只用Visitor&lt; Visitor&lt;A&gt; &gt; 代替Visitor2&lt;A&gt;,因为当有多个外部匹配并且内部匹配首先尝试失败时,它不会“回溯”到外部解析器。这凸显了多次调度的困难(Christian 提到的):您需要全局查看所有潜在功能。预计速度慢和编译单元大;只有在规范中并且没有找到快捷方式时才实施。

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多