fork download
  1. #include <cassert>
  2. #include <iostream>
  3. using std::cout; using std::endl;
  4.  
  5. struct A {
  6. virtual ~A() noexcept = default;
  7. };
  8.  
  9. struct B : virtual public A {
  10. virtual ~B() noexcept = default;
  11. };
  12.  
  13. struct C1 : public B {
  14. virtual ~C1() noexcept = default;
  15. };
  16.  
  17. struct C2 : public B {
  18. virtual ~C2() noexcept = default;
  19. };
  20.  
  21. struct D : public C1, public C2 {
  22. virtual ~D() noexcept = default;
  23. };
  24.  
  25. int main() {
  26. A *ptr = nullptr;
  27. ptr = new D;
  28. cout << "ptr = " << ptr << endl;
  29.  
  30. cout << "dynamic_cast<D*>(ptr) = " << dynamic_cast<D*>(ptr) << endl; // legally downcast
  31. cout << "dynamic_cast<B*>(ptr) = " << dynamic_cast<B*>(ptr) << endl; // ambigious sub-class B // downcast failed
  32.  
  33. cout << "----------\n";
  34.  
  35. C1 *ptrC1 = nullptr;
  36. ptrC1 = dynamic_cast<C1*>(ptr);
  37. cout << "ptrC1 = dynamic_cast<C1*>(ptr) = " << ptrC1 << endl;
  38.  
  39. cout << "\t" << "dynamic_cast<B*>(ptrC1) = " << dynamic_cast<B*>(ptrC1) << endl;
  40.  
  41. // dynamic_cast @ MSDN: http://msdn.microsoft.com/en-us/library/cby9kycs.aspx
  42. }
  43.  
  44.  
  45.  
Success #stdin #stdout 0s 3032KB
stdin
Standard input is empty
stdout
ptr = 0x8738008
dynamic_cast<D*>(ptr) = 0x8738008
dynamic_cast<B*>(ptr) = 0
----------
ptrC1 = dynamic_cast<C1*>(ptr) = 0x8738008
	dynamic_cast<B*>(ptrC1) = 0x8738008