gpt4 book ai didi

c++ - C++ 中派生类的等式测试

转载 作者:IT老高 更新时间:2023-10-28 23:15:25 24 4
gpt4 key购买 nike

Possible Duplicate:
What’s the right way to overload operator== for a class hierarchy?

在 C++ 中,派生类如何以有意义的方式覆盖基类相等性测试?

例如,假设我有一个基类 A。类 B 和 C 派生自 A。现在给定两个指向两个 A 对象的指针,我可以测试它们是否相等(包括任何子类数据)吗?

class A {
public: int data;
};

class B : public A {
public: float more_data; bool something_else;
};

class C : public A {
public: double more_data;
};


A* one = new B;
A* two = new B;
A* three = new C;

//How can I test if one, two, or three are equal
//including any derived class data?

有干净的方法吗?我最好的选择是什么?

谢谢!

最佳答案

我记得读过关于 public-non-virtual/non-public-virtual 习语及其优点的简洁描述,但没有在哪里。 This wikibook有一个好的描述。

下面是你如何将它应用到 op==:

struct A {
virtual ~A() {}

int a;

friend
bool operator==(A const& lhs, A const& rhs) {
return lhs.equal_to(rhs);
}
// http://en.wikipedia.org/wiki/Barton-Nackman_trick
// used in a simplified form here

protected:
virtual bool equal_to(A const& other) const {
return a == other.a;
}
};

struct B : A {
int b;

protected:
virtual bool equal_to(A const& other) const {
if (B const* p = dynamic_cast<B const*>(&other)) {
return A::equal_to(other) && b == p->b;
}
else {
return false;
}
}
};

struct C : A {
int c;

protected:
virtual bool equal_to(A const& other) const {
if (C const* p = dynamic_cast<C const*>(&other)) {
return A::equal_to(other) && c == p->c;
}
else {
return false;
}
}
};

关于c++ - C++ 中派生类的等式测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1765122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com