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. template<typename T>
  31. struct BaseSender : public virtual EventSender {
  32. void f() {
  33. sendEvent((T*)this);
  34. }
  35. };
  36. struct DerivedSender : public BaseSender<DerivedSender> {
  37. };
  38.  
  39. struct MyClass : public virtual EventReceiver<DerivedSender> {
  40. void receiveEvent(DerivedSender* pSender) { }
  41. };
  42.  
  43. int main() {
  44. MyClass my;
  45. DerivedSender derivedSender;
  46. derivedSender.pReceiver = &my;
  47. derivedSender.f();
  48. return 0;
  49. }
Success #stdin #stdout 0.02s 2720KB
stdin
Standard input is empty
stdout
Standard output is empty