考虑以下抽象类:
class Abstract {
public:
// ...
virtual bool operator==(const Abstract& rhs) const = 0;
// ...
};
现在假设我正在从这个抽象类创建多个派生类。但是,在与自己的类型进行比较时,每个都使用不同的算法,在与任何其他派生类进行比较时使用通用算法。在以下两个选项之间,哪个是更好、更有效的选项?
选项 A:
class Derived : public Abstract {
public:
// ...
bool operator==(const Abstract& rhs) const {
// Code for comparing to any of the other derived classes
}
bool operator==(const Derived& rhs) const {
// Code for comparing to myself
}
// ...
};
选项 B:
class Derived : public Abstract {
public:
// ...
bool operator==(const Abstract& rhs) const {
const Derived* tmp = dynamic_cast<const Derived*>(&rhs);
if (tmp) {
// Code for comparing to myself
}
else {
// Code for comparing to any of the other derived class
}
}
};
我真的很好奇这些选项有什么优点和缺点,因为 C++ 类型转换对我来说是一个相对神秘的话题。此外,哪种解决方案更“标准”,第二种解决方案对性能有影响吗?
可能有第三种解决方案吗?特别是如果有很多派生类,每个派生类都需要针对不同派生类的特殊比较算法?