Если у вас есть отношения-наследования, реализованные с использованием общего наследования, и у вас есть алмаз наследования, у вас будет что-то вроде:
- класс потока
- классы потока ввода и вывода, полученные из потока
- класс потока ввода/вывода, полученный из обоих
В этом случае, как используется в стандартной библиотеке (?), в той мере, в которой iostream как is-istream, так и is-the ostream, istream isa-stream и ostream - это поток, и, кроме того, они являются одним и тем же потоком, любые функции в потоке, которые имеет смысл применять к iostream, должны иметь дело с одной и той же базовой структурой.
В С++ для того, чтобы копии потока в istream и ostream могли быть разделены, они должны быть фактически унаследованы ими.
Однако, если вы предпочитаете, вы не можете наследовать фактически и каждый раз, когда вы ссылаетесь на члена базового класса, укажите, какая из двух копий (одна в istream или одна в ostream) вы хотите (либо путем литья, либо используя область:: blah).
Мой вопрос в том, что [edit: есть ли какой-нибудь другой случай, где], кроме "Это не действительно отношение is-a, я использовал naughtily используемое публичное наследование как синтаксическое удобство, когда оно не было концептуально действительным" или "Мне никогда не нужно полиморфно ссылаться на базовый класс из самого производного класса, поэтому невероятно небольшие накладные расходы не стоят этого", есть какая-то причина, по которой она была бы концептуально действительной для наследования практически нет и иметь две копии базы класс, по одному для каждого промежуточного класса сестры?