【问题标题】:Overloading binary operator> in a derived class in c++在 C++ 的派生类中重载二元运算符>
【发布时间】:2013-01-11 23:00:29
【问题描述】:

我已经广泛搜索了这个问题的具体答案,但找不到。我正在尝试使用可以在派生类中覆盖的虚拟运算符> 创建一个基类。目前我遇到了问题,因为声明函数只需要一个输入变量(如“bool operator>(Derived & a)”但试图在 cpp 文件中定义它告诉我它需要两个输入(如“bool operator >(派生和a,派生和b))

我尝试过定义内联运算符,但随后我得到错误,它认为派生类仍然是抽象的,因为我将派生类型传递给运算符,如上所示,而不是基类。但是如果我传递了基类,那么我就无法访问派生的成员变量,我需要进行比较。

我想我在这里遗漏了一些简单的东西,但我似乎无法弄清楚它是什么。

希望您能提供帮助。 谢谢

【问题讨论】:

  • 你定义为bool Derived::operator>(Derived &a) ...吗?
  • 虚拟比较运算符有点难以理解。您想如何比较具有不同类型的两个对象?
  • 我想比较具有相同类型的对象,但我不知道要进入哪个类型。我想允许每种类型指定自己的比较运算符,以便以哪个类型为准比较,可以进行正确的比较。

标签: c++ binary overloading operator-keyword derived


【解决方案1】:

为了使虚拟调用从基的引用/指针工作,您需要在函数中使用基类型,例如

class Derived : public Base
{
    .... 
    bool operator>(Base &a)
    {
         Derived *pa = dynamic_cast<Derived *>(&a);
         return this->something > pa->something;   // Or whatever... 
    }

   .... 
};

如果你改变类型,它变成一个不同的函数,当你使用基指针或引用来引用操作符时,它将使用基类中的那个。

【讨论】:

  • reinterpret_cast 在这里?来吧,这是dynamic_cast的用例!
  • ">" 左侧的参数不仍然是 Base 吗?我需要两者都被派生。
【解决方案2】:

为什么不让operator&gt;() 成为非虚拟的,让它调用私有虚拟函数?

像这样:

class Base {
public:
    bool operator>(Base &a) {
        return implementingFunction(a);
    }

private:
    virtual bool implementingFunction(Base &a) = 0;
};

【讨论】:

  • 这究竟解决了哪个问题?您仍然必须具有相同的签名并在实现内部的基类和派生类之间进行某种转换。如果我们做一个通用的“比较(a,b)”类型函数,它为“小于、等于和大于”返回-1、0、+1(或类似的),那么这确实是有道理的。但是如果我们只是想要“小于”函数,那么我真的看不出重点[但也许我在这里遗漏了一些东西]。
【解决方案3】:
#include <iostream>
using namespace std;
class base{
public :
        virtual bool operator> (base& obj) { cout<<"b\n";return true;}
        virtual ~base(){}
};

class derived: public base{
public:
        virtual bool operator> (derived& obj) { cout<<"d\n";return true;}
        ~derived(){}
};

int main()
{

base *a=new derived(),b;
if(*a>b) { delete a; cout<<"Done!\n"; }

return 0;
}

【讨论】:

  • 我遇到了一个问题,即基运算符采用基对象,而派生运算符采用派生对象,当我尝试调用函数时出现编译器错误(传入指向基址的指针),这似乎是由于没有实际发生的继承引起的。您的代码表明输入参数不同不会有问题,所以您知道为什么会发生这种情况吗?
猜你喜欢
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多