Я думаю, ты путаешь вещи здесь? Исходя из фона Java? В C++ «статический класс» больше похож на другой способ определения пространства имен. Вам не следует использовать ограниченную доступность для членов класса (потому что они по существу не являются «настоящими» членами класса).
Чтобы быть более точным: использование ключевого слова не повлияет на итоговый код вообще. То, что считается «статическим классом», обычно является классом только с членами static
.
Пути вы используете ключевое слово static
работает из-за простой факт, что вы в состоянии определить класс и объекты одновременно:
static class ClassOfStaticObject {
ClassOfStaticObject() {
// ...
}
} myObject;
Это было бы так же, как это:
class ClassOfStaticObject {
ClassOfStaticObject() {
// ...
}
};
static ClassOfStaticObject myObject;
чтобы добиться того, что вы хотели бы сделать, все, что вам нужно сделать, это делает ваш базовый класс абстрактным, имея чистые виртуальные функции членов:
class Socket {
Socket(void);
Socket(PORT);
~Socket(void);
// ...
virtual int send(const char *data) = 0;
virtual int recv(const char *data) = 0;
}
Это больше не позволит вам создать экземпляр этого класса или любого производного класса, если только этот класс не реализует эти виртуальные методы. В качестве альтернативы вы можете скрыть все конструкторы как private
или protected
.
Чтобы ограничить видимость членов базовых классов, вы можете использовать private
или protected
как вы сделали уже, но я предложил бы использовать вместо public
, а затем объявить те член вы хотели бы получить доступ только из детей (т.е. не от наружный) как protected
.
class Socket {
protected:
Socket(void);
Socket(PORT);
~Socket(void);
// ...
virtual int send(const char *data) = 0;
virtual int recv(const char *data) = 0;
void something_protected();
public:
void something_debug(void);
}
class ServerSocket : public Socket {
// ...
}
Таким образом, вы будете иметь возможность вызывать something_debug()
на объекты класса ServerSocket
, но вы не сможете позвонить something_protected()
снаружи, ни вы будете иметь возможность создавать объекты класса Socket
.
Вы можете легко попробовать и протестировать свой код, чтобы ответить на этот вопрос самостоятельно. – EdChum