У меня есть класс Derived
, который наследуется непосредственно от двух базовых классов. , Основание1
и Основание2
. Я хотел бы знать, безопасно ли вообще сравнивать указатели с базовыми классами, чтобы определить, являются ли они одним и тем же объектом Derived
:
Base1* p1;
Base2* p2;
/*
* Stuff happens here. p1 and p2 now point to valid objects of either their
* base type or Derived
*/
//assert(p1 == p2); //This is illegal
assert(p1 == static_cast<Base1*>(p2)); //Is this ok?
assert(static_cast<Derived*>(p1) == static_cast<Derived*>(p2)); //How about this?
Указатели гарантированно действительны, но не обязательно чтобы указать на объект Derived
. Я предполагаю, что это, вероятно, нормально, но я хотел знать, нормально ли это с технической точки зрения C++. На самом деле я никогда не выполняю никаких операций с указателями, я просто хочу знать, указывают ли они на один и тот же объект.
РЕДАКТИРОВАТЬ: кажется безопасным, если я могу гарантировать, что p1
и p2
указывают на объекты Derived
. Я в основном хочу знать, безопасно ли это, если они этого не делают - если один или оба указывают на базовый объект, обязательно ли сравнение завершится ошибкой? Опять же, я могу гарантировать, что указатели действительны (т.е. p1
никогда не будет указывать на объект Base2
или наоборот)