Это типичное наследство алмаза.Это происходит даже в стандартной библиотеке, где iostream происходит как от istream, так и от ostream, и оба они происходят из ios_base.
Существуют различные проблемы:
Если у отца естьвиртуальный метод, и Son1 и Son2 реализуют его, если только Grandson не реализует его тоже, он должен указать, какой из методов Son1 и Son2 он реализует.
Если у отца есть какие-либо элементы данных, Grandsonих дважды.
В любом случае у отца есть v-таблица, так что вы, похоже, получаете 2 копии этого.
Поэтому средние классыобычно используют виртуальное наследование, что сложно, но эффективно означает, что только конечный класс получает базовый класс.Таким образом, в этом случае сам внук отвечает за создание Отца и, как предполагается, «имеет» его.
Существуют и другие вопросы, которые следует остерегаться, если вы собираетесь использовать какие-либо указатели.Особенно будьте осторожны при наведении в пустоту и из нее *.