是否可以动态绑定 operator>?
Is it possible to dynamically bind operator>?
动态绑定要求虚函数在基 class 及其派生 class 中应具有相同的参数列表。这让我想知道 operator> 是否可以动态绑定?下面的demo似乎证明不能。
#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
您必须在派生中使用与基中相同的签名,以便它有效地覆盖基:
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;
};
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++ 中有很多方法可以进行双重分派,它们都必须手动完成。
动态绑定要求虚函数在基 class 及其派生 class 中应具有相同的参数列表。这让我想知道 operator> 是否可以动态绑定?下面的demo似乎证明不能。
#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
您必须在派生中使用与基中相同的签名,以便它有效地覆盖基:
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;
};
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++ 中有很多方法可以进行双重分派,它们都必须手动完成。