c++ - 派生类中的重载运算符

标签 c++

我正在学习 Lafore 的第 4 版 C++ 书籍,但我遇到了这个问题。

我有这两个类,CountDn 派生自Counter。在 CountDn 中,我想重载递减运算符的前缀和递增和递减的后缀。

它适用于所有运算符,除非我尝试执行 ++c11

我从编译器中得到这些错误:

50:10: error: no match for 'operator++' (operand type is 'CountDn')

50:10: note: candidate is:

41:13:注:CountDn

CountDn::operator++(int)

41:13: note: candidate expects 1 argument, 0 provided

尽管 get_count() 工作正常,但我不明白为什么前缀运算符不起作用。

我的想法是,如果 CounterDn 类派生自 Counter,那么所有公共(public)函数都应该可以访问。我可以修改什么以便更好地理解这个问题的解决方案?

#include <iostream>
using namespace std;

class Counter{
protected:
    unsigned int count;                //count
public:
    Counter() : count(0)               //constructor, no args
    {  }
    Counter(int c) : count(c)          //constructor, one arg
    {  }
    unsigned int get_count() const     //return count
    {
        return count;
    }
    Counter operator ++ ()             //incr count (prefix)
    {
        return Counter(++count);
    }
};


class CountDn : public Counter{
public:
    CountDn() : Counter()              //constructor, no args
    { }
    CountDn(int c): Counter(c)       //constructor, 1 arg
    { }
    CountDn operator -- ()             //decr count (prefix)
    {
        return CountDn(--count);
    }

    CountDn operator --(int){
        return CountDn(count --);
    }
    CountDn operator ++(int)
    {
        return CountDn(count++);
    }
};

int main() {
    CountDn c1(10),c2;
    c2 = ++c1;
    cout << c1.get_count() << endl;
    return 0;
}

最佳答案

operator++()operator++(int)operator++ 函数的两个重载。

当编译器在派生类中看到 operator++(int) 函数时,它不会寻找该函数的其他重载。因此,在尝试编译该行时找不到 operator++()

c2 = ++c1;

因此,从基类中找不到前置自增运算符。您可以使用 using 声明将预增量重载从基类带入派生类。

class CountDn : public Counter{
  public:

    using Counter::operator++;

    CountDn() : Counter()              //constructor, no args
    { }
    CountDn(int c): Counter(c)       //constructor, 1 arg
    { }
    CountDn operator -- ()             //decr count (prefix)
    {
        return CountDn(--count);
    }

    CountDn operator --(int){
        return CountDn(count --);
    }
    CountDn operator ++(int)
    {
        return CountDn(count++);
    }
};

现在,operator++ 的两个重载都可用于 CountDn 对象。

但是,下面还是有问题

c2 = ++c1;

因为预递增运算符返回的是 Counter 对象,而不是 CountDn 对象。您可以使用:

++c1;
c2 = c1;

解决这个问题。

关于c++ - 派生类中的重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51935631/

相关文章:

c++ - Qt 有没有办法获取表单上的所有小部件?

c++ - 如何从字符串中每行输出一个单词

c++ - 在 Linux 上链接到我自己的共享库中的某些函数时出现问题

c++ - 移动仅由另一个成员函数使用的成员函数并使它们成为本地函数时的性能考虑?

c++ - 从类定义中省略 "private"关键字是否令人困惑?

c++ - 如何在相关数据结构中存储 JSON 键值(我用 cpp boost 解析过)?

c++ - 如何为类的私有(private)和公共(public)成员分配内存

c++ - 使用接受的连接作为套接字 (cpp-netlib)

c++ - 从 C++ 调用 Tensorflow Lite .tflite CNN 模型时的非法指令

c++ - 仅在特定类型的数组中添加模板化参数