【问题标题】:C++ operator overloading between multiple derived classes多个派生类之间的 C++ 运算符重载
【发布时间】:2013-12-18 05:50:45
【问题描述】:

我有一个基类和两个派生类。我想实现一些乘法运算符,可用于将两个类中的对象相乘。

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;
};

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

【问题讨论】:

  • 您是否考虑过一个外部operator*,它不是任何一个类的方法,但可能是两者的朋友?

标签: c++ templates inheritance operator-overloading


【解决方案1】:
Base operator * (Base & b1, Base & b2) { return b1 * b2; } \

// 这会产生编译错误。

您是否试图将两个完全不同的对象与第三个对象相乘?其实这没有任何意义。当使用非成员函数重载运算符时使用此函数原型。

所以对于你的类你也可以使用,

Base operator * (Base & b2) { return *this * b2; } 

//如果你的函数类不是抽象的。

这基本上扩展为this->operator*(b2)

现在来了,

D1 operator * (D1 & d) {//do some operation here}
D1 operator * (D2 & d) {//same as above...}

为什么会有这条线?为什么需要两个函数?

您可以使用转换函数从一种类型的对象进行转换,反之亦然 然后只有一个重载的 operator* 可以完成你的工作。

虽然代码量几乎相同,但至少看起来 清洁工。

您也可以使用模板,但为此您必须有一个通用的运算符重载实现。 这可以使用转换函数来实现,因为这样您就可以为 operator* 函数实现通用代码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多