Насколько безопасно предполагать, что указатель производного класса такой же, как указатель первого базового класса? - PullRequest
1 голос
/ 05 августа 2020

Рассмотрим эту программу:

struct Base1 { void *x; virtual ~Base1() { } };
struct Base2 { void *x; virtual ~Base2() { } };

struct Derived : Base1, Base2 { };

int main()
{
    Derived d;
    return &d == static_cast<void *>(static_cast<Base1 *>(&d));
}

Во всех моих тестах на Clang, G CC и Visual C ++ возвращаемое значение 1.

Я понимаю, что C ++ не На самом деле это не гарантирует.

Однако, практически говоря , безопасно ли на это полагаться? (Предположим, что нет виртуального наследования. Изменить: Я предполагаю полиморфные c базовые классы.)

Какие реалистичные c ситуации существуют (если есть), в которых указатель на производный класс потребует корректировки, прежде чем его можно будет использовать в качестве указателя на его первый (не виртуальный, полиморфный c) базовый класс?

1 Ответ

0 голосов
/ 05 августа 2020

Я могу придумать причину, по которой компилятор (или компоновщик, если используется -flto) теоретически может изменить порядок базовых классов в классе. Он может рассматривать это как возможность оптимизации, если Base2 используется больше, чем Base1.

Я не думаю, что это хоть сколько-нибудь вероятно, но возможно.

...