Рассмотрим следующий абстрактный класс:
class Abstract {
public:
// ...
virtual bool operator==(const Abstract& rhs) const = 0;
// ...
};
Теперь предположим, что я создаю несколько производных классов из этого абстрактного класса.Однако каждый из них использует свой алгоритм при сравнении со своим собственным типом и универсальный алгоритм при сравнении с любым из других производных классов.Среди следующих двух вариантов, который был бы лучшим, более эффективным вариантом
1005 * Вариант 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 ++ является для меня относительно загадочной темой.Кроме того, какое решение является более «стандартным», и оказывает ли второе решение какое-либо влияние на производительность?
Возможно, существует третье решение?Особенно, если было много производных классов, каждый из которых нуждался в собственном специальном алгоритме сравнения с различными производными классами?