【发布时间】:2014-11-21 23:17:05
【问题描述】:
我想实现一个函数来比较派生类。但是我发现我必须将基类对象转换为派生类对象。
有没有办法避免在这里使用强制转换或其他更好的设计来实现比较功能?
class A {
public :
virtual bool equal(const A & obj) const = 0;
};
class AA : public A{
public:
AA (int i) : m_i(i) {}
virtual bool equal(const A & obj) const
{
return m_i == dynamic_cast<const AA&>(obj).m_i;
}
private:
int m_i;
};
int main () {
AA aa1(10), aa2(9);
A &a1 = aa1, &a2 = aa2;
a1.equal(a2);
return 0;
}
【问题讨论】:
-
请注意,
dynamic_cast引用类型可能会引发异常。可能更好地转换为指针,如果指针返回 NULL,您可能只想返回false。 -
可能在基类中为成员变量
m_i使用了一个虚拟的getter? -
阅读有关双重调度及其经典解决方案 - 模式访问者的信息。
-
如果 obj 不是 AA,您的代码将在动态转换中抛出异常。如果您改用指针,它会起作用。如何避免它取决于您如何使用 equals 和您的整体多态设计。
-
在我看来,让相等操作考虑比程序员意识到的(静态类型)更多的信息(动态类型)是不好的。然而,虽然这在 C++ 中是不自然的,但据我所知,它已经在 Java 中进行了彻底的研究。我会在那里寻找答案,如果我想要这里涉及的那种行为,非常动态的类型,我可能会从 C++ 切换到 Java。
标签: c++ inheritance