Я просматривал множественное наследование для C++ Бьерн Страуструп, опубликовано в майском выпуске журнала C/C++ Users Journal за 1999 г.. Приведенный ниже отрывок взят из того же (Страница 5/17),
4.4 Кастинг
Явное и неявное приведение может также включать изменение значения указателя с помощью дельты:
class A { void f(); }; class B { int f(); }; class C : A, B { }; C* pc; B* pb; pb = (B*)pc; // pb = (B*)((char*)pc+delta(B)) pb = pc; // pb = (B*)((char*)pc+delta(B)) pc = pb; // error: cast needed <-------------------- HERE pc = (C*)pb; // pc = (C*)((char*)pb-delta(B))
Он показывает нам, что pb = pc
можно выполнить без явного приведения. Это определенно означает, что приведение выполняется неявно. Потом,
- почему, когда мы пытаемся использовать указатель
pc = pb
, необходимо приведение типов? - Что и где это правило, которое направляет это?
- Связано ли это с увеличением/уменьшением указателя по дельта-значению?
ИЗМЕНИТЬ
Джонатан Ми отметил этот вопрос как дубликат Какой тип приведения перейти от родительского к дочернему?. Боюсь, я не согласен. Мой вопрос касается почему выполняется кастинг и где находится это правило, которое предписывает нам кастовать или не кастовать. Я думаю, что логика может быть той же, но концепция совершенно другая. В своем вопросе он сомневается (настаивает на том, чтобы не использовать динамическое приведение) в использовании dynamic_cast и static_cast. Мое сомнение все еще на несколько шагов позади его.