Да, это может быть достигнуто. Вы можете ограничить видимость общедоступными, защищенными, личными ключевыми словами, а также видимостью источника.
Заявленная видимость обычно понимается.
Видимость источника (если вы пришли с Java) немного отличается.
Java: у вас есть один файл для объектного интерфейса / реализации.
Cpp: у вас есть один файл для интерфейса. реализация может находиться в интерфейсе или в одном или нескольких файлах реализации (cpp, cxx).
Если вы используете абстрактные классы / интерфейсы / функции отдельно от открытого интерфейса библиотеки, они эффективно скрыты и недоступны (ну, это неверно, если у вас особенно любопытные пользователи, которые сбрасывают символы - тогда они могут переопределить интерфейс, и ссылка на символы, но ... это явно неопределенная территория для них). Так что вам нужно только сделать символы, которые вам нравятся, видимыми. Хорошая идея использовать соглашение об именах пакетов / библиотек, чтобы избежать связывания ошибок - поместите классы в пространство имен, зарезервированное для частной реализации библиотеки. Простой.
Будет ли это полезно в C ++ ... это неплохо, хотя я лично считаю, что для языка есть более высокие приоритеты.
пример видимости источника:
/* publicly visible header file */
namespace MON {
class t_button {
protected:
t_button();
virtual ~t_button();
public:
typedef enum { Default = 0, Glowing = 1 } ButtonType;
/* ... all public virtual methods for this family of buttons - aka the public interface ... */
public:
t_button* CreateButtonOfType(const ButtonType& type);
};
}
/* implementation file -- not visible to clients */
namespace MON {
namespace Private {
class t_glowing_button : public t_button {
public:
t_glowing_button();
virtual ~t_glowing_button();
public:
/* ... impl ... */
};
}
}
MON::t_button* MON::t_button::CreateButtonOfType(const ButtonType& type) {
switch (type) {
case Glowing :
return new Private::t_glowing_button();
case Default :
return new Private::t_glowing_button();
/* .... */
default :
break;
}
/* ... */
return 0;
}