Đối với hầu hết các lớp học có nguồn gốc, tương đương với chỉ đơn giản có nghĩa là các biến thành viên tất cả các giá trị cùng
Trong C++ này được gọi là 'bình đẳng' và thường được thực hiện bằng operator==()
. Trong C++, bạn có thể ghi đè lên ý nghĩa của các nhà khai thác, người ta có thể viết:
MyType A;
MyType B;
if (A == B) {
// do stuff
}
Và có ==
gọi một chức năng tùy chỉnh bạn xác định.
Tôi nghĩ rằng bạn muốn phân biệt sự bình đẳng với danh tính có nghĩa là cùng một đối tượng (tức là cùng một địa chỉ).
Bạn có thể thực hiện nó như hàm thành viên hoặc chức năng miễn phí (từ wikipedia):
bool T::operator ==(const T& b) const;
bool operator ==(const T& a, const T& b);
Trong trường hợp của bạn, bạn muốn thực hiện operator==
cho lớp cơ sở, và sau đó thực hiện những gì bạn đang làm.
More cụ thể nó sẽ trông như thế này:
class MyBase
{
virtual ~MyBase(); // reminder on virtual destructor for RTTI
// ...
private:
virtual bool is_equal(const MyBase& other);
friend bool operator ==(const MyBase& a, const MyBase& b);
// ...
};
bool operator ==(const MyBase& a, const MyBase& b)
{
// RTTI check
if (typeid(a) != typeid(b))
return false;
// Invoke is_equal on derived types
return a.is_equal(b);
}
class D1 : MyBase
{
virtual bool is_equal(const Base& other)
{
const D1& other_derived = dynamic_cast<const D1&>(other);
// Now compare *this to other_derived
}
};
class D2 : MyBase;
{ };
D1 d1; D2 d2;
bool equal = d1 == d2; // will call your operator and return false since
// RTTI will say the types are different
Nguồn
2012-02-15 04:21:14
được đối tượng tương đương theo gì với bạn? –
Đối với hầu hết các lớp dẫn xuất, tương đương chỉ đơn giản có nghĩa là các biến thành viên đều có cùng giá trị. – RandomBits
Câu hỏi này có thể liên quan: http://stackoverflow.com/questions/1691007/whats-the-right-way-to-overload-operator-for-a-class-hierarchy –