不能访问类中声明的受保护成员

error C2248 : cannot access protected member declared in class

本文关键字:受保护 成员 声明 访问 不能      更新时间:2023-10-16

我有一个问题与基类的保护构造函数,这是在派生类的私有函数中使用:

基类:

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'

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

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

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

。、替换

Socket* Client = new Socket( client_sock );

struct DSocket: Socket
{
    DSocket( SOCKET const socket )
        : Socket( socket )
    {}
};
Socket* Client = new DSocket( client_sock );