fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct EventReceiverBase {
  6. virtual ~EventReceiverBase() { }
  7. };
  8.  
  9. template<typename T>
  10. struct EventReceiver : public virtual EventReceiverBase {
  11. virtual void receiveEvent(T* pSender) = 0;
  12. };
  13.  
  14. struct EventSender {
  15. EventReceiverBase* pReceiver;
  16.  
  17. template<typename T>
  18. void sendEvent(T* pSender) {
  19. EventReceiver<T>* pCastedReceiver =
  20. dynamic_cast<EventReceiver<T>*>(pReceiver);
  21. // HERE IS THE PROBLEM
  22. // pCastedReceiver is null. T is BaseSender. The pointer
  23. // being casted is really of type EventReceiver<DerivedSender>*,
  24. // but it tries to cast to EventReceiver<BaseSender>*, and that
  25. // fails.
  26. pCastedReceiver->receiveEvent(pSender);
  27. }
  28. };
  29.  
  30. struct BaseSender : public virtual EventSender {
  31. };
  32. struct DerivedSender : public BaseSender {
  33. void f() {
  34. sendEvent(this);
  35. }
  36. };
  37.  
  38. struct MyClass : public virtual EventReceiver<DerivedSender> {
  39. void receiveEvent(DerivedSender* pSender) { }
  40. };
  41.  
  42. int main() {
  43. MyClass my;
  44. DerivedSender derivedSender;
  45. derivedSender.pReceiver = &my;
  46. derivedSender.f();
  47. return 0;
  48. }
Success #stdin #stdout 0.02s 2720KB
stdin
Standard input is empty
stdout
Standard output is empty