How to: Implement Managed Virtual Events
Important This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here. ArchiveDisclaimer

How to: Implement Managed Virtual Events

This sample implements virtual, managed events in an interface and class.


// mcppv2_events5.cpp
// compile with: /clr
using namespace System;

public delegate void MyDel();
public delegate int MyDel2(int, float);

// managed class with virtual event
ref class IEFace {
   virtual event MyDel ^ E;   // declares three accessors (add, remove, and raise)

// managed interface with virtual event
public interface struct IEFace2 {
   event MyDel2 ^ E2;   // declares two accessors (add and remove)

// implement virtual events
ref class EventSource : public IEFace, public IEFace2 {
   virtual event MyDel2 ^ E2;

   void Fire_E() {

   int Fire_E2(int i, float f) {
      try {
         return E2(i, f);
      catch(System::NullReferenceException^) {
         return 0;   // no handlers

// class to hold event handlers, the event receiver
public ref struct EventReceiver {
   // first handler
   void H1() {
      Console::WriteLine("In handler H1");

   // second handler
   int H2(int i, float f) {
      Console::WriteLine("In handler H2 with args {0} and {1}", i.ToString(), f.ToString());
      return 0;

int main() {
   EventSource ^ pE = gcnew EventSource;
   EventReceiver ^ pR = gcnew EventReceiver;

   // add event handlers
   pE->E += gcnew MyDel(pR, &EventReceiver::H1);
   pE->E2 += gcnew MyDel2(pR, &EventReceiver::H2);

   // raise events
   pE->Fire_E2(1, 2.2);

   // remove event handlers
   pE->E -= gcnew MyDel(pR, &EventReceiver::H1);
   pE->E2 -= gcnew MyDel2(pR, &EventReceiver::H2);

   // raise events, but no handlers so, no effect
   pE->Fire_E2(1, 2.5);


In handler H1
In handler H2 with args 1 and 2.2


Note that you are currently not able to specify that a simple event overrides or hides a base class event. You must define all of the event's accessor functions, and specify the new or override keyword on each accessor function.

// mcppv2_events5_a.cpp
// compile with: /clr /c
delegate void Del();

ref struct A {
   virtual event Del ^E;
   virtual event Del ^E2;

ref struct B : A {
   virtual event Del ^E override;   // C3797
   virtual event Del ^E2 new;   // C3797

ref struct C : B {
   virtual event Del ^E {   // OK
      void raise() override {}
      void add(Del ^) override {}
      void remove(Del^) override {}

   virtual event Del ^E2 {   // OK
      void raise() new {}
      void add(Del ^) new {}
      void remove(Del^) new {}

See Also

© 2015 Microsoft