Define the protocols as classes, and required methods as pure virtual functions:

class ProtocolOne {

public:

virtual void draw()  = 0;

};

class ProtocolTwo {

public:

virtual void castCameraRays() = 0;

}

Inherit the Protocol by whichever classes conforming to the protocols:

class SubClassOne : public ProtocolOne {

public:

void draw() { };

}

class SubClassTwo : public ProtocolOne, public ProtocolTwo {

public:

void draw() { };

void castCameraRays { };

}

Then with delegates defined as the follows:

class Dopamine {

public:

ProtocolOne *delegate;

private:

void loop() {

if (delegate) {

delegate->draw();

}

}

}

class Banana {

public:

ProtocolTwo *delegate;

void loop() {

if(delegate) {

delegate->castCameraRays();

}

}

}

Assign the instantiated objects whose classses conform to the protocols to the delegates:

int main() {

Dopamine dopamineOne;

Dopamine dopamineTwo;

Banana banana;

SubClassOne *subclassOne = new SubClassOne();

SubClassTwo *subclassTwo = new SubClassTwo();

dopamineOne.delegate = subclassOne;

dopamineTwo.delegate = subclassTwo;

banana.delegate = subclassTwo;

/* … */

return 0;

}