【发布时间】:2015-10-20 15:28:21
【问题描述】:
我想在结构层次结构(抽象基 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”的值
【问题讨论】:
-
错误信息是什么?
-
在增加 B 类型的对象时确定要返回 A 类型的对象吗?
-
@antonio 嗯……没想到!真的。我当然可以在每个子类中实现这两种方法。唯一让我烦恼的是重复代码,但也许没有更好的方法来做到这一点?
-
不要忘记运算符只是语法糖:仅使用它们有效地执行递增操作。我个人很难理解如何以有意义的方式继承这样的操作,但也许其他人可以提供这样的观点
标签: c++ inheritance operator-overloading abstract