Advertisement
Guest User

Untitled

a guest
Jan 21st, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. class A
  4. {
  5.     public:
  6.         virtual ~A();
  7.         std::string Name();
  8.     private:
  9.         virtual std::string DoName();
  10. };
  11.  
  12. class B1 : virtual public A
  13. {
  14.     private:
  15.         std::string DoName();
  16. };
  17.  
  18. class B2 : virtual public A
  19. {
  20.     private:
  21.         std::string DoName();
  22. };
  23.  
  24. A::~A() {}
  25. std::string A::Name()    { return DoName(); }
  26. std::string A::DoName()  { return "A"; }
  27. std::string B1::DoName() { return "B1"; }
  28. std::string B2::DoName() { return "B2"; }
  29.  
  30. class D : public B1, public B2
  31. {
  32.     private:
  33.         std::string DoName () { return "D"; }
  34. };
  35.  
  36. void f1( A& x )  { std::cout << "f1:" << x.Name() << std::endl; }
  37. void f2( B1& x ) { std::cout << "f2:" << x.Name() << std::endl; }
  38. void f3( B2& x ) { std::cout << "f3:" << x.Name() << std::endl; }
  39. void g1( A& x )  { std::cout << "g1:" << x.Name() << std::endl; }
  40. void g2( B1& x ) { std::cout << "g2:" << x.Name() << std::endl; }
  41. void g3( B2& x ) { std::cout << "g3:" << x.Name() << std::endl; }
  42.  
  43. int main()
  44. {
  45.     D d;
  46.     B1* pb1 = &d; // Преобразование D* -> B*
  47.     B2* pb2 = &d;
  48.     B1& rb1 = d;    // Преобразование D& -> B&
  49.     B2& rb2 = d;
  50.  
  51.     f1(d);
  52.     f2(d);
  53.     f3(d); // Полиморфизм
  54.  
  55.     g1(d);
  56.     g2(d);
  57.     g3(d); // Срезка
  58.  
  59.     // dynamic_cast/RTTI
  60.     std::cout << ((dynamic_cast<D*>(pb1) != 0) ? "ok " : "bad " );
  61.     std::cout << ((dynamic_cast<D*>(pb2) != 0) ? "ok " : "bad " );
  62.     try
  63.     {
  64.         dynamic_cast<D&>(rb1);
  65.         std::cout << "ok ";
  66.     } catch(...)
  67.     {
  68.         std::cout << "bad ";
  69.     }
  70.     try
  71.     {
  72.         dynamic_cast<D&>(rb2);
  73.         std::cout << "ok ";
  74.     } catch(...)
  75.     {
  76.         std::cout << "bad ";
  77.     }
  78.  
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement