Ver el siguiente código:

#include<iostream>

using namespace std;


class ex
{
    int i;
public:
    ex(int x){i=x;}
    void operator-()
    {
        i=-i;
    }
    int geti(){return i;}
};

class derived:public ex
{
    int j;
public:
    derived(int x,int y):ex(x){j=y;}
    void operator-()
    {
     j=-j;
    }
    int getj(){return j;}
};


int main()
{
    derived ob(1,2);
    -ob;
    cout<<ob.geti();
    cout<<"\n"<<ob.getj();
}

Salida:

1
-2
Process returned 0 (0x0)   execution time : 0.901 s
Press any key to continue.

Defino el operador - en las clases base y derivada, pero -ob; llama solo al operador de la clase derivada. Entonces, ¿cómo cambiar también el campo i a -i (llamando al operador en la clase base).

¿Necesito alguna función explícita para lograr esto?

2
Sri lakshmi kanthan 11 dic. 2019 a las 15:02

2 respuestas

La mejor respuesta

Parece que quieres decir

void operator-()
{
    ex::operator -();
    j=-j;
}

En cualquier caso, sería mejor declarar los operadores como por ejemplo

ex & operator-()
{
    i = -i;

    return *this;
}

Y

derived & operator-()
{
    ex::operator -();

    j = -j;

    return *this;
}

También podría hacer que el operador sea virtual. Por ejemplo

#include<iostream>

using namespace std;


class ex
{
    int i;
public:
    virtual ~ex() = default;

    ex(int x){i=x;}
    virtual ex & operator-()
    {
        i = -i;

        return *this;
    }

    int geti(){return i;}
};

class derived:public ex
{
    int j;
public:
    derived(int x,int y):ex(x){j=y;}
    derived & operator-() override
    {
        ex::operator -();

        j = -j;

        return *this;
    }
    int getj(){return j;}
};


int main()
{
    derived ob(1,2);

    ex &r = ob;

    -r;

    cout<<ob.geti();
    cout<<"\n"<<ob.getj();
}    
5
Vlad from Moscow 11 dic. 2019 a las 12:32

Su clase derivada podría declararse así:

class derived:public ex
{
    int j;
public:
    derived(int x,int y):ex(x){j=y;}
    void operator-()
    {
        j=-j;
        ex::operator-();
    }
    int getj(){return j;}
};
1
Eduardo Fernandes 11 dic. 2019 a las 12:29