我有一个基础calss和2个派生类。我想实现一些乘法运算符,可以用来乘以两个类中的对象。
class Base
{
public:
virtual ~Base() {}
virtual void print() = 0;
Base operator * (Base & b1, Base & b2) { return b1 * b2; } <---- this wont work because of pure virtual function
};
class D2;
class D1 : public Base
{
public:
void print() { ....}
D1 operator * (D1 & d) {//do some operation here}
D1 operator * (D2 & d) {//same as above...}
private:
int i;
};
class D2 : public Base
{
public:
void print() { ....}
D2 operator * (D1 & d) { ..... }
D2 operator * (D2 & d) { ..... }
private:
double j;
double m;
};
这是我最初的设计,但我知道它不会起作用,所以我愿意 实现这个的好设计是什么?有没有办法使用模板实现这个? 谢谢!
答案 0 :(得分:1)
Base operator * (Base & b1, Base & b2) { return b1 * b2; } \
//这将导致编译错误。
您是否尝试将两个完全不同的对象与第三个对象相乘?实际上这没有任何意义。当使用非成员函数重载运算符时,将使用此函数原型。
因此,对于您的课程,您也可以使用,
Base operator * (Base & b2) { return *this * b2; }
//假设您的函数类不是抽象的。
这基本上扩展为this-&gt; operator *(b2)
现在来了,
D1 operator * (D1 & d) {//do some operation here}
D1 operator * (D2 & d) {//same as above...}
为什么这行?你为什么需要两个功能?
您可以使用转换功能从一种类型的对象转换,反之亦然 然后只有一个重载的操作员*可以完成你的工作。
虽然,代码量几乎相同,但至少会看起来如此 清洁剂。
您也可以使用模板,但为此您必须具有操作符重载的通用实现。 这可以使用转换函数来实现,因为这样您就可以为operator *函数实现通用代码。
如果我完全误解了您的问题,或者我的方向完全相反,请告诉我。