运算符 +/- 在 C++ 中作为非成员函数重载

Operator +/- overloading as a non member function in C++

所以我写了一些实现这个层次结构的代码:

class A 
{
    int x;
    int y;
public:
    A ()  { }
    void setX(int x) { this->x = x;}
    void setY(int y) { this->y = y;}    
    int getX(void) { return x;}
    int getY(void) { return y;}    
    virtual int somefunc() = 0;
    friend B operator- ( B b1, B b2);
};    

class B : public A
{
    int somefunc() {return 0;}
};

class C : public A
{
    int somefunc() {return 1;}  
};

class D : public C
{
    int somefunc() {return 2;}
};
/*
// 1 st attempt - fail
A operator- (const A& a_inst, const A& a_inst2)
{
    A a_temp; 
    a_temp.setX( a_inst.getX() - a_inst2.getX() );
    a_temp.setY( a_inst.getY() - a_inst2.getY() );    
    return a_temp;  
}

// 2nd attempt - FAIL
const A* operator- (const A* a1, const A* a2)
{
    a1.setX( a1.getX() - a2.getX() );
    a1.setY( a1.getY() - a2.getY() );
    return a1;
}
//*/


//3rd  attempt
B operator- ( B b1, B b2)
{
    int temp1x =  b1.getX();
    int temp2x = b2.getX();
    b1.setX( temp1x - temp2x );

    int temp1y =  b1.getY();
    int temp2y = b2.getY();
    b2.setY( temp1y - temp2y );
    return b1;
}



 int main()
{
    B b();
    C c();

    b = b - dynamic_cast<B*>(c) ;
}

我明白因为 A 是抽象的 class 它不能被实例化,所以我不能用 Class A 实例来做。

是否可以重载 +/- 一次(每个)并使其应用于该层次结构中属于 class 的每个实例?我还想指出,我希望能够同时对不同 classes 的对象做同样的事情,如下所示:

C c;
B b;
b = b - c;

编辑 1~ 添加了我目前正在尝试开始工作的第二个版本的重载。

编辑 2~ 更正了 setter 的错误调用

编辑 3~ 添加了第三个版本,仍然出现错误

您的代码存在一些问题: 1. 指定继承类型:public

class B : public A {
    ...
}

2。 B运算符- (const B& a_inst, const B& a_inst2)

{
    B a_temp; 
    a_temp.setX() = a.getX() - a_inst2.getX();
    a_temp.setY() = a.getY() - a_inst2.getY();

    return a_temp;  
}

你不能那样使用,因为 setX 和 setY returns 值不是指针或引用。