错误C2248:无法访问类中声明的受保护成员

时间:2014-05-17 17:14:20

标签: c++ constructor protected

我遇到了基类的受保护构造函数的问题,它在派生类的私有函数中使用:

基类:

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'

在^^^^线上。是什么导致了这个错误?

1 个答案:

答案 0 :(得分:4)

这对我来说有点令人惊讶,因为它是一个构造函数,但它与非静态成员函数的原理相同。受保护的基类非静态成员函数只能在派生类的实例上调用(或者再次从该类派生),否则只需从基类派生就可以访问任何派生类的受保护特性。

解决方法就是这样做,专门为了调用受保护的基类构造函数而派生一个类。

,例如,替换

Socket* Client = new Socket( client_sock );

struct DSocket: Socket
{
    DSocket( SOCKET const socket )
        : Socket( socket )
    {}
};

Socket* Client = new DSocket( client_sock );