Если вы избавляетесь от шаблона дымовой завесы, то, что у вас есть, включает бесконечную рекурсию. На данный момент, подумайте о наследовании как о немного ином способе определения содержания (что это такое). Вы говорите, что myA содержит myB, который, в свою очередь, содержит myA, который, в свою очередь, содержит myB и т. Д. Навсегда - то есть любой отдельный объект любого типа имеет бесконечный размер ...
Редактировать: как указано в litb, ни одна из этих структур не содержит ничего, поэтому теоретически они не занимают места (благодаря пустой оптимизации базового класса). Хотя это правда, что это может помешать структурам самим иметь бесконечный размер, AST, который должен сгенерировать компилятор для любого из них, все еще бесконечен - например, myA :: myB :: myA :: myB :: myA :: myB :: myA :: myB ... myB :: btype (конечный элемент myA::atype
, myA::tA
или myB::tB
) является допустимым именем типа для любого уровня вложенности. По крайней мере, как обычно пишется компилятор, в AST не допускаются циклы, оставляя бесконечное AST единственной альтернативой.