是否可以动态绑定运算符>?

时间:2015-03-21 23:23:31

标签: c++ operator-overloading operators virtual-functions dynamic-binding

动态绑定要求虚函数在基类及其派生类中应具有相同的参数列表。这让我想知道运营商是否>可以动态地避开?以下演示似乎证明它不能。

#include <iostream>
using namespace std;
struct B
{
    B(int b = 0):m_b(b){}
    virtual bool operator>(const B& rhs)const {cout << "B::operator>" << endl;return m_b > rhs.m_b;}
    int m_b;
};

struct D: public B
{
    D(int b = 0, long d = 0):B(b),m_d(d){}
    virtual bool operator>(const D& rhs)const {cout << "D::operator>" << endl; return m_d > rhs.m_d;}
    long m_d;
};
int main() 
{
    D d1(0,0),d2(1,-1);
    B& b1(d1),b2(d2);

    cout << (b1 > b2) << endl;
    cout << "------------" << endl;
    cout << (d1 > d2) << endl;
    return 0;
}

输出:

B::operator>
0
------------
D::operator>
1

2 个答案:

答案 0 :(得分:2)

virtual bool operator>(const D& rhs)const {
  cout << "D::operator>" << endl;
  return m_d > rhs.m_d;
}
virtual bool operator>(const B& rhs)const override final {
  if(D const*=dynamic_cast<D const*>(&rhs))
    return *this>*other;
  return B::operator>(rhs);
}

解决了您的问题。它现在对两个参数进行双重调度,如果它们都是D,则调用正确的重载。否则它依赖于B的版本。

在C ++中有很多方法可以进行双重调度,它们都必须手动完成。

答案 1 :(得分:0)

你必须在派生中使用与基础相同的签名,以便它有效地覆盖基础:

struct D: public B
{
    D(int b = 0, long d = 0):B(b),m_d(d){}
    bool operator>(const B& rhs)const override {  cout << "D::operator>" << endl; return m_d > static_cast<const D*>(&rhs)->m_d;}
    long m_d;
};