Using Channel-specific Portal Classes
RWPortal cannot handle the details of communication, such as making the connection to the server, because the parameters and steps involved in making the connection are different for each channel type. The Networking package solves this problem by using channel-specific portal classes, such as RWSocketPortal. These classes inherit from RWPortal, and add constructors and operations specific to their channel type. For example, RWSocketPortal adds constructors that accept socket addresses, and it adds socket-specific functions for operations like returning the underlying RWSocket object or connecting to a user-defined Internet server.
The channel-specific portal classes do not change the behavior of RWPortal member functions that use inheritance—RWPortal has no virtual member functions. For this reason, you can assign a channel-specific portal to an RWPortal without changing the semantics of the portal, as shown in Example 4, Assigning a channel-specific portal.
Example 4 – Assigning a channel-specific portal
RWSocketPortal makeConnection()
{
RWSocketPortal sp( RWInetAddr(3010,"net.roguewave.com") ); //1
return sp;
}
 
main()
{
RWWinSockInfo info;
RWPortal portal = makeConnection(); //2
.
.
.
}
//1 Implicitly constructs the socket-specific implementation.
//2 Converts an RWSocketPortal to an RWPortal using the copy constructor RWPortal::RWPortal(const RWPortal&). This conversion does not lose the socket-specific part of the portal by slicing, but it does lose the extra interface provided in the RWSocketPortal class. In exchange, subsequent code that uses the portal is independent of the communication channel.