С++: сравнение указателя базы с производным от одного и того же объекта

Пример:

class A{
    int x;
};
class B{};
class C : public A, public B {};

C c;
A* a = &c;
B* b = &c;

когда я проверяю значение & c и b, они различны, поскольку b находится после a в памяти, но все же, когда я оцениваю & c == b, они одинаковы, почему это так?

Ответ 1

В выражении &c == b оба операнда должны быть принуждены к одному типу. В этом случае &c (a C*) можно преобразовать в B*, поскольку B является доступным базовым классом C. Это то же самое преобразование, что и в B* b = &c, поэтому результирующие значения совпадают, и сравнение возвращает true.