Классы, производные от структуры Pub_Derv
, могут обращаться к переменной-члену prot_mem
класса Base
, поскольку она остается защищенным членом в структуре Pub_Derv
. У классов, производных от структуры Priv_Derv
, напротив, такого доступа нет. Все члены, которые структура Priv_Derv
унаследовала от класса Base
, являются закрытыми.
Если бы был определен другой класс, скажем, Prot_Derv
, использующий защищенное наследование, открытые члены класса Base
в этом классе будут защищенными. У пользователей структуры Prot_Derv
не было бы никакого доступа к функции pub_mem()
, но ее члены и друзья могли бы обратиться к унаследованному члену.
Будет ли доступно преобразование производного класса в базовый класс (см. раздел 15.2.2), зависит от того, какой код пытается использовать преобразование, а также от спецификатора доступа, используемого при наследовании производного класса. С учетом, что класс D
происходит от класса B
:
• Пользовательский код может использовать преобразование производного класса в базовый, D
открыто наследует класс B
. Пользовательский код не может использовать преобразование, если наследование было защищенным или закрытым.
• Функции-члены и друзья класса D
могут использовать преобразование в В
независимо от вида наследования D
от B
. Преобразование производного в прямой базовый класс всегда доступно для членов и друзей производного класса.
• Функции-члены и друзья классов, производных от класса D
, могут использовать преобразование производного класса в базовый, если наследование было открытым или защищенным. Такой код не сможет использовать преобразование, если наследование классом D
класса В
было закрытым.
Без наследования у класса будет два разных вида пользователей: обычные пользователи и
При наследовании появляется третий вид пользователей, а именно производные классы. Базовый класс делает защищенными те части своей реализации, которые позволено использовать его производным классам. Защищенные члены остаются недоступными обычному пользовательскому коду; закрытые члены остаются недоступными производным классам и их друзьям.
Подобно любому другому классу, базовый класс объявляет члены своего интерфейса открытыми. Класс, используемый как базовый, может разделить свою реализацию на члены, доступные для производных классов и доступные только для базового класса и его друзей. Член класса, относящийся к реализации, должен быть защищен, если он предоставляет функцию или данные, которые производный класс должен будет использовать в собственной реализации. В противном случае члены реализации должны быть закрытыми.
Подобно тому, как дружественные отношения не передаются (см. раздел 7.3.4), они также не наследуются. У друзей базового класса нет никаких специальных прав доступа к членам его производных классов, а у друзей производного класса нет специальных прав доступа к базовому классу:
class Base {
//