Delegate Visual C++ .NET

#include "stdafx.h"
using namespace System;
delegate void OutputMessage(String ^name);
void SayHello(String ^name){
    Console::Write("Hello there ");
    Console::WriteLine(name);
}
ref class MyClass{
public:
    static void Print1(String ^name);
    void Print2(String ^name);
    void Print3(String ^name);
};
void MyClass::Print1(System::String ^name){
    Console::Write("1 ");
    Console::WriteLine(name);
}
void MyClass::Print2(System::String ^name){
    Console::Write("2 ");
    Console::Write(name);
}
void MyClass::Print3(System::String ^name){
    Console::Write("3 ");
    Console::WriteLine(name);
}
void main(){
    OutputMessage^ say;
    say = gcnew OutputMessage(&SayHello);
    say += gcnew OutputMessage(&MyClass::Print1);
    MyClass ^computer = gcnew MyClass();
    say = say + gcnew OutputMessage(computer, &MyClass::Print2);
    say += gcnew OutputMessage(computer, &MyClass::Print3);
    say->Invoke("s1");
    say = say - gcnew OutputMessage(&MyClass::Print1);
    say -= gcnew OutputMessage(computer, &MyClass::Print3);
    say("s1");
}