重载运算符+

时间:2014-03-19 13:14:02

标签: c++ inheritance

我正在寻找以下“问题”的优雅解决方案:

考虑类Base和Child,以及operator +在这里工作的方式:

class Base
{
public:
    Base(int a=0) : mValue(a) {};
    Base(const Base& rhs) : mValue(rhs.mValue) {};
    Base& operator=(const Base& rhs) {
        if (this==&rhs) return *this;
        mValue=rhs.mValue;
    }


    friend const Base operator+(Base &lhs, Base &rhs);

private:
    int mValue;
};

const Base operator+(Base &lhs, Base &rhs)
{
    Base result(lhs.mValue+rhs.mValue);
    return result;
}

class Child : public Base
{
public:
    Child(int a=0) : Base(a) {};
};

int main()
{
    Child a(2);
    Child b(5);
    Child c(a+b);  // **** This line ****
            Child d;
            d=(a+b); // **** or this other one ****

}

main 中标记的行给出错误: 无法从'const Base'转换为'Child'

我完全理解运算符已在 Base 类中定义,并返回 Base 类型的对象,该对象无法转换为 Child 。 一个解决方案是为 Child 类重载 operator + ,但我想知道是否有更好,成本更低的方法。我的印象是我忘记了一个更容易的选择。谢谢!

3 个答案:

答案 0 :(得分:1)

您可以定义构造函数Child(Base& obj)然后Child c=(a+b);语句就可以了,然后您可以根据需要使用基础对象。

答案 1 :(得分:1)

没有更简单的选择。

运营商重载和类层次结构并不是很想混合。当一个应该是值类型的类型(或者你为什么要重载运算符?)是层次结构的一部分时,我个人非常怀疑。你能描述一下你的实际架构吗?在那里重载运算符真的有意义吗?

答案 2 :(得分:0)

如果您想在不添加适当构造函数的情况下从基础构建子项,则还有另一种选择。您可以在基类中声明强制转换运算符,并返回mValue

operator int() const;

这样,编译器就会隐式地完成工作。

PS :确保添加剂操作符的正确性:

friend Base operator+(const Base &lhs, const Base &rhs);