【问题标题】:How to access overloaded operator in base class from derived class?如何从派生类访问基类中的重载运算符?
【发布时间】:2020-04-04 17:06:24
【问题描述】:

见以下代码:

#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();
}

输出:

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

我在基类和派生类中都定义了- 运算符,但-ob; 只调用派生类的运算符。那么如何也将i字段改为-i(调用基类中的操作符)。

我需要任何显式函数来实现这一点吗?

【问题讨论】:

标签: c++ class inheritance operator-overloading operators


【解决方案1】:

看来你的意思

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

在任何情况下,最好像声明这样的运算符

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

    return *this;
}

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

    j = -j;

    return *this;
}

您也可以将操作员设为虚拟。例如

#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();
}    

【讨论】:

  • 一元 operator-() 通常通过其操作数的值返回一个否定的副本(例如,在重载运算符时遵循“行为类似于 int”指南)。所以表达式-ob一般不会改变对象ob,而是创建一个不同的对象。
  • @Peter 我同意,但问题的作者想“就地”更改对象。:)
【解决方案2】:

你的派生类可以这样声明:

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;}
};

【讨论】:

  • 当“可以”足够时,我总是对“应该”有点挑剔。例如对于j 也应该使用初始化列表而不是在构造函数主体中赋值
猜你喜欢
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多