This structural pattern translates one class interface into another.
This is a class adapter, but there also exists an object adapter.
#include <memory> #include <iostream> // Interface class IUsbCSocket { public: virtual void justConnect() = 0; }; // Legacy class class MicroUsbSocket { public: void lookThenConnect() { std::cout << "Look then connect Micro-USB." << std::endl; } }; // Adapter class class UsbC2MicroUsbSocketAdapter : public IUsbCSocket, private MicroUsbSocket { public: void justConnect() override { std::cout << "Just connect USB-C." << std::endl; lookThenConnect(); } }; int main() { std::unique_ptr<IUsbCSocket> socket(new UsbC2MicroUsbSocketAdapter()); socket->justConnect(); // ... return 0; }