运算符重载和继承(保持同一类型)

Operator overloading and inheritance (keeping the same type)

我对 C++ 中的运算符重载和继承有一些疑问。

速写:

class A {
public: 
    A operator+ (const A &b) const { ... }
};

class B : public A {
    ...
};

现在假设我有两个实例 Bxy。如果我添加它们,我将得到 A 类型的东西,但我希望它是 B.

类型的东西

完成此任务的最佳方法是什么(除了在 class B 中重新实现它们)? CRTP?

您可以在 class 之外实现 operator+ 作为模板:

template<class type> type operator+(const type& left, const type& right)
{
    type toReturn;
    toReturn.value = left.value + right.value;
    return toReturn;
}

class A {
private:
    int value;

    template <class type> 
    friend type operator+<type>(const type& left, const type& right);
};

class B : public A {
};

int main()
{
    B test1, test2;

    B test3 = test1 + test2;
}

这种方法有一定的缺点。编译器将主动尝试为您不想定义 operator+ 的类型实例化 operator+ 模板,因此请注意这一点。