c++ - 具有抽象继承的后缀运算符++

标签 c++ inheritance operator-overloading abstract

我想在结构层次结构(抽象基 A 和子 B)中实现前缀和后缀运算符++。当仅在基类中实现前缀时,这工作正常。然而,当在子类中实现后缀版本时(因为它不能在抽象类中实现)它不起作用。

struct A {
    virtual A& operator++(){std::cout << "A: prefix ++" << std::endl; return *this;}
    virtual void foo() = 0;
};

struct B : A {
    void foo() override {};
    //virtual B& operator++() override {std::cout << "B: prefix ++" << std::endl; return *this;}
    //B operator++(int i) {std::cout << "B: postfix ++" << std::endl; return *this;}
};

int main(int argc, const char * argv[]) {
    B b;
    ++b; // Compile error here if I implement postfix in B
    return 0;
}

问题是我想避免重复代码,因为所有派生类都将以相同的方式使用 operator++,所以最好不要在各自的类中实现它们。使用抽象类的全部目的就是为了避免这种情况!

我的问题是:解决这个问题最优雅的方法是什么?

编辑。错误消息:无法增加类型“B”的值

最佳答案

问题是派生类中的 operator++ 将名称隐藏在基类中。尝试将以下内容添加到 B:

using A::operator++;

尽管如此,您可能会发现很难使后增量函数表现出多态性。协变返回类型将不起作用。

Live demo.

关于c++ - 具有抽象继承的后缀运算符++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33240699/

相关文章:

c++ - 在 int main() 中使用类函数

c++ - 与不同变量类型相比的变量的 Clang AST 匹配器

python-2.7 - 在 python 中使用 super 和 class 方法

c++ - 重载运算符将函数指针作为参数,我如何检索函数指针的参数

c++ - 稀疏矩阵

c++ - 全局变量中的动态内存分配错误

ruby - 为什么 Array.constants 不显示 Object 类中的常量列表?

symfony - 使用 Doctrine 将实体与不同的子类合并

c++ - 重载 << 运算符时出现未处理的异常

c++ - 为字典 cpp 创建一个 []= 运算符