У меня есть класс Derived
, который наследуется непосредственно от двух базовых классов, Base1
и Base2
. Я хотел бы знать, безопасно ли вообще сравнивать указатели на базовые классы, чтобы определить, являются ли они одним и тем же объектом 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
указывают на объекты Derrived
. Я в основном хочу знать, если это безопасно, если они не... если один или оба указывают на базовый объект, будет ли сравнение неизбежно неудачным? Опять же, я могу гарантировать, что указатели действительны (т.е. p1
никогда не укажет на объект Base2
или наоборот)