C ++运算符在多个派生类之间重载

时间:2013-12-18 05:50:45

标签: c++ templates inheritance operator-overloading

我有一个基础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;
};

这是我最初的设计,但我知道它不会起作用,所以我愿意 实现这个的好设计是什么?有没有办法使用模板实现这个? 谢谢!

1 个答案:

答案 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 *函数实现通用代码。

如果我完全误解了您的问题,或者我的方向完全相反,请告诉我。