Код у вас здесь отлично.Классам разрешается определять членов с любыми именами, которые они хотят, даже если они соответствуют имени члена в родительском классе.Единственный раз, когда у вас возникнут проблемы, это если с использованием , то одно из этих имен приведет к двусмысленности.
В вашем случае наличие трех static
членов данных в классах B
, C
и D
не вызовут никаких проблем, и экземпляр каждого класса type_
будет отличаться от всех остальных.То, что они имеют одинаковое имя, не означает, что C ++ рассматривает их как переопределения;только virtual
функции-члены могут быть переопределены.
В контексте каждого класса и его функций-членов любые ссылки на name_
всегда будут ссылаться на name_
из этого класса, так как классы скрывают имена отлюбой из их базовых классов и поэтому компилятор будет смотреть только в текущем классе.В глобальном масштабе вы можете ссылаться на поля name_
с их полностью определенными именами, например A::name_
, B::name_
и т. Д.
Что более важно, тип наследования, который вы здесь используете, виртуальный или не-virtual, не имеет значения, потому что здесь обсуждаются только имена переменных.Поскольку существует только одна копия каждого элемента данных static
, то, закончит ли ваш класс D
наследование двух копий A::name_
, не имеет значения; не может наследовать две копии, поскольку существует только одна.