Guest User

upcasting

a guest
Dec 14th, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.52 KB | None | 0 0
  1. using binaries = std::vector<char>;
  2.  
  3. class IClipboardReader
  4. {
  5. public:
  6.     virtual binaries Read() const = 0;
  7. };
  8.  
  9. class IClipboardWriter
  10. {
  11. public:
  12.     virtual void Write(binaries bins) = 0;
  13. };
  14.  
  15. class ClipboardSlot : public IClipboardReader, IClipboardWriter
  16. {
  17. public:
  18.     binaries Read() const override
  19.     {
  20.         // ...
  21.         return { 'a', 'b', 'c' };
  22.     }
  23.  
  24.     void Write(binaries data) override
  25.     {
  26.         // ...
  27.     }
  28. };
  29.  
  30. template<typename CharType = char>
  31. std::basic_ostream<CharType>& operator<<( // vypisanie vectoru
  32.     std::basic_ostream<CharType>& out,
  33.     const std::vector<CharType>& value
  34. )
  35. {
  36.     for (auto& c : value) out << c; return out;
  37. }
  38.  
  39. void main()
  40. {
  41.     auto slot = ClipboardSlot();
  42.     IClipboardReader& upcasted1 = slot; // OK
  43.     auto upcasted2 = (IClipboardReader&)slot; // Error: 'IClipboardReader': cannot instantiate abstract class
  44.     auto upcasted3 = std::forward<const IClipboardReader&>(slot); // Error: 'IClipboardReader': cannot instantiate abstract class
  45.     auto upcasted4 = static_cast<const IClipboardReader&>(slot); // Error: 'IClipboardReader': cannot instantiate abstract class
  46.  
  47.     auto slotPtr = std::make_shared<ClipboardSlot>();
  48.     auto upcasted5 = static_cast<std::shared_ptr<IClipboardReader>>(slotPtr); // OK
  49.  
  50.     std::cout << "upcasted1:" << upcasted1.Read() << std::endl;
  51.     std::cout << "upcasted2:" << upcasted2.Read() << std::endl;
  52.     std::cout << "upcasted3:" << upcasted3.Read() << std::endl;
  53.     std::cout << "upcasted4:" << upcasted4.Read() << std::endl;
  54.     std::cout << "upcasted5:" << upcasted5->Read() << std::endl;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment