Сравнение указателей множественного наследования

У меня есть класс 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или наоборот)

15
задан Lucretiel 28 June 2012 в 21:43
поделиться