У меня проблема, но я не знаю, правильно ли я ее решил или есть более правильные способы.Листинг базы данных const для производных
Теперь у меня есть два класса (и один наследует от другого):
class Data_Base
{
...
}
class Data_Error : public Data_Base
{
...
}
В настоящее время, в перегрузке оператора равенства, я должен бросить константную ссылку на базовый объект к производным объект снова, чтобы проверить его участников. В настоящее время я делаю это:
bool Data_Error::operator==(const Data_Base &other) const
{
if (Data_Base::operator !=(other))
return false;
const Data_Error &other_cast = (const Data_Error &)other;
... More tests on other_cast ...
}
Теперь, нет никакой возможности, что в литейном момент переменная other
это нечто иное, чем Data_Error
, так как Data_Base
==
оператора (и оператора !=
, так как она реализуется как отрицание ==
) также проверяет тип производного объекта, поэтому он достигает этой строки только в том случае, если тип верен.
Теперь есть ли какие-либо проблемы с этим? Есть ли «более правильное» решение?
Я работаю с Qt (5.7), так есть ли решение «больше QTish»?
Почему вы сравниваете 'Data_Error' с потомком Data_Base? Какое значение имеет значение для сравнения типов в разных ветвях в иерархии? Просто придерживайтесь 'bool Data_Error :: operator == (const Data_Error & other) const', я говорю. – StoryTeller
@StoryTeller Поскольку, когда у меня есть список базовых типов, я хочу выполнить итерацию на нем, чтобы проверить, соответствуют ли некоторые из элементов этому. Я просто вызываю == для каждого элемента; в функции я проверяю, является ли тип одинаковым, иначе они не равны. Но для этой цели тип другой должен быть базовым, иначе программа не знает, как сравнивать две разные ветви. – frarugi87
Является ли ваш 'operator ==' виртуальным? Если это не так, оно не будет работать так, как вы ожидаете. – StoryTeller