提问人:Vero 提问时间:4/6/2022 更新时间:4/6/2022 访问量:136
C++ 上的虚拟相等函数
Virtual Equal Function on C++
问:
我正在尝试做这样的事情:
class A
{
public:
A() = default;
~A() = default;
public:
bool operator==(const A& a)
{
return this->equal(a);
};
private:
virtual bool equal(const A& other) const = 0;
};
class B : public A
{
public:
B() = default;
~B() = default;
private:
virtual bool equal(const A& other) const override
{
const B* b = dynamic_cast<const B*>(&other);
if (!b)
return false;
return m_example == b->m_example;
}
private:
double m_example; //This is just an example data I don't need specific solution for double :)
};
目标:只有相同类型的类之间才可能相等 = B。
- 可以吗?
- 是否有标准解决方案来拥有虚拟相等运算符?
- 我将从 A 中继承很多(4/8 类),我怎样才能以干净的方式做到这一点,检查指针是否为 null 看起来很丑陋。
你能帮帮我吗?
答:
3赞
Sam Varshavchik
4/6/2022
#1
动态演员是否丑陋是一个见仁见智的问题。这是一场无休止的辩论,但在这里并不重要。这是因为这里不需要动态强制转换。这可以通过继承来完成:
class B; // Forward declaration.
class A {
// Same as above
private:
virtual bool equal(const A& other) const = 0;
virtual bool equal(const B& other) const { return false; }
};
// ... B class:
bool equal(const A& other) const override
{
return other.equal(*this);
}
bool equal(const B &other) const override
{
return m_example == other.m_example;
}
评论
2赞
Nathan Pierson
4/6/2022
不应该在某个地方使用吗?B::equal(const A& other)
other
0赞
Sam Varshavchik
4/6/2022
是的,现在修好了。
0赞
Vero
4/7/2022
非常感谢!正如我在问题中所说,我将有 8 个从 A 继承的类,我必须为每个类添加 8 个“相等”函数,每个类包括基类?或者每个类只有两个相等的函数,而基类有 8 个相等的函数?对不起,我无法概括您的代码,如果许多类继承自 A 或例如另一个类 C 继承自 B :)如果可以,请帮忙。
0赞
Sam Varshavchik
4/7/2022
为什么你认为该类需要为类实现?除了返回 ,它可能做什么,就像基类中的默认实现一样,它做同样的事情。当然不是。只有基类需要为每个子类定义 的默认实现,并且每个子类实现两个重写,一个用于自身,一个用于自身。B
equal()
C
false
equal()
A
0赞
Vero
4/9/2022
先生,一切都清楚了!非常感谢!!
评论
virtual
virtual
virtual
final