Advertisement
Cynacyn

dynamic_cast usage with virtual hiearachy classes

Oct 24th, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.13 KB | None | 0 0
  1. //////////////////////////////////////////////////////////////////////////
  2. // VIRTUAL INHERITANCE
  3. class MostBase
  4. {
  5. public:
  6.    virtual ~MostBase() {}
  7. };
  8.  
  9. class X : virtual public MostBase
  10. {};
  11.  
  12. class Y : virtual public MostBase
  13. {};
  14.  
  15. class MostDerived : public X, public Y
  16. {
  17. private:
  18.    std::string _str;
  19.  
  20. public:
  21.    MostDerived()
  22.       : _str("Helolo!")
  23.    {}
  24.    std::string foo() { return _str; }
  25. };
  26.  
  27. int main()
  28. {
  29.    MostBase * pB = new MostDerived;
  30.    MostDerived * pD_sc = static_cast<MostDerived*>(pB); // ошибка комплияции
  31.    MostDerived * pD_rc = reinterpret_cast<MostDerived*>(pB); // pD_rc теперь указывает на начало *pB
  32.    // при виртуальном наследовании объекты размещаются в памяти так: X, Y, MostDerived, MostBase
  33.    cout << pD_rc->foo() << endl; // undefined behavior, скорее всего возникнет ошибка доступа к памяти во времени исполнения
  34.    MostDerived * pD_dc= dynamic_cast<MostDerived*>(pB); //ok
  35.    cout << pDr->foo() << endl; // ok
  36.    
  37.     return 0;
  38. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement