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

use*_*087 3 c++ constructor protected

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

基类:

class Socket 
{

    public:
    virtual ~Socket();
    // Constructors :
    Socket();

  protected:
    Socket(SOCKET& s);
 };
Run Code Online (Sandbox Code Playgroud)

派生类:

    class Server : public Socket 
    {
    public:

         Server();
        ~Server();
    private: 
        int ServerLoop();
    };
Run Code Online (Sandbox Code Playgroud)

我尝试在 ServerLoop 函数中创建 Socket 对象

SOCKET client_sock = accept( m_socket, ( sockaddr* )&client_addr, &size );
Socket* Client = new Socket( client_sock );
^^^^^^
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

error C2248: 'NET_SOCKETS::Socket::Socket' : cannot access protected member
declared in class 'NET_SOCKETS::Socket'
Run Code Online (Sandbox Code Playgroud)

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

Che*_*Alf 5

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

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

例如,替换

Socket* Client = new Socket( client_sock );
Run Code Online (Sandbox Code Playgroud)

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

Socket* Client = new DSocket( client_sock );
Run Code Online (Sandbox Code Playgroud)