我遇到了基类的受保护构造函数的问题,它在派生类的私有函数中使用:
基类:
class Socket
{
public:
virtual ~Socket();
// Constructors :
Socket();
protected:
Socket(SOCKET& s);
};
派生类:
class Server : public Socket
{
public:
Server();
~Server();
private:
int ServerLoop();
};
我尝试在ServerLoop函数中创建Socket对象
SOCKET client_sock = accept( m_socket, ( sockaddr* )&client_addr, &size );
Socket* Client = new Socket( client_sock );
^^^^^^
但是我收到了这个错误:
error C2248: 'NET_SOCKETS::Socket::Socket' : cannot access protected member
declared in class 'NET_SOCKETS::Socket'
在^^^^线上。是什么导致了这个错误?
答案 0 :(得分:4)
这对我来说有点令人惊讶,因为它是一个构造函数,但它与非静态成员函数的原理相同。受保护的基类非静态成员函数只能在派生类的实例上调用(或者再次从该类派生),否则只需从基类派生就可以访问任何派生类的受保护特性。
解决方法就是这样做,专门为了调用受保护的基类构造函数而派生一个类。
,例如,替换
Socket* Client = new Socket( client_sock );
与
struct DSocket: Socket
{
DSocket( SOCKET const socket )
: Socket( socket )
{}
};
Socket* Client = new DSocket( client_sock );