【发布时间】:2012-09-26 09:38:41
【问题描述】:
假设我有一个基类和两个派生自它的类:
class Base
{
protected:
double value;
public:
virtual ~Base();
Base(double value) : value(value) {}
Base(const Base& B) { value=B.value; }
Base operator+ (const Base& B) const {
return Base(value+B.value);
}
};
class final Derived1 : public Base {
public:
Derived1(double value) : Base(value) {}
};
class final Derived2 : public Base {
public:
Derived2(double value) : Base(value) {}
};
我要完成以下工作:
int main(int argc, char *argv[])
{
Derived1 a = Derived1(4.0);
Derived2 b = Derived2(3.0);
a+a; // this should return a Derived1 object
b+b; // this should return a Derived2 object
a+b; // this should FAIL AT COMPILE TIME
return 0;
}
换句话说,我想保证继承的operator+ 只对调用实例同类型的对象进行操作。
我如何干净地做到这一点?我发现自己为每个类重新定义了运算符:
class final Derived1 : public Base {
...
Derived1 operator+ (const Derived1& D1) const {
return Derived1(value+D1.value);
}
...
};
class final Derived2 : public Base {
...
Derived2 operator+ (const Derived2& D1) const {
return Derived2(value+D1.value);
}
...
};
但这只是一种痛苦。此外,对我来说,重用代码似乎并不合适。
在这里使用的正确技术是什么?
【问题讨论】:
-
如果你想要这个,不要把
operator+放在底座上。 (另外,基地不应该有一个虚拟析构函数吗?) -
@R.MartinhoFernandes:你是说我必须为每个派生类重新定义 operator+?但定义完全相同,除了类型。这里真的没有办法保存代码吗?
-
“完全一样,除了类型”不是“完全一样”。但是,是的,有一种方法可以保存代码。我会发布一个答案。
-
但是您似乎没有在这里考虑一个大问题:如果我添加
class Derived3 : public Derived1会怎样?Derived3 d3; Derived1 d1; d1+d3;应该编译吗?如果是,它应该有什么语义?如果没有,那你就不走运了。
标签: c++ oop class operator-overloading code-reuse