Advertisement
avr39ripe

PV913TypeCast

Aug 4th, 2020
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <math.h>
  5. #include <chrono>
  6.  
  7. class Polygon
  8. {
  9. protected:
  10.     std::vector<float> sides;
  11.  
  12. public:
  13.     Polygon& addSide(float size) { sides.push_back(size); return *this; };
  14.     Polygon& setSide(int sideId, float size)
  15.     {
  16.         sides[sideId] = size; return *this;
  17.     };
  18.     float getSide(int sideId)const { return sides[sideId]; };
  19.     virtual float perimeter()const
  20.     {
  21.         float per{ 0 };
  22.         for (const auto& side : sides)
  23.         {
  24.             per += side;
  25.         }
  26.         return per;
  27.     };
  28.     virtual float area()const;
  29.  
  30.     const Polygon& sidesInfo()const
  31.     {
  32.         for (int i{ 0 }; i < sides.size(); ++i)
  33.         {
  34.             std::cout << " Side " << char('A' + i) << " is " << sides[i] << " long\n";
  35.         }
  36.         return *this;
  37.     }
  38.  
  39.     std::string name()const
  40.     {
  41.         std::string nm{ typeid(*this).name() }; //"class Polygon"
  42.         return nm.substr(5);
  43.     }
  44.  
  45.     const Polygon& info()const
  46.     {
  47.         std::cout << name() << ":\n"
  48.             << " Perimeter: " << perimeter()
  49.             << " Area: " << area() << '\n';
  50.         sidesInfo();
  51.         std::cout << '\n';
  52.  
  53.         return *this;
  54.     }
  55.  
  56. };
  57.  
  58. float Polygon::area()const
  59. {
  60.     return -1;
  61. }
  62.  
  63. class Rectangle : public Polygon
  64. {
  65. public:
  66.     Rectangle(float sideA, float sideB) { addSide(sideA); addSide(sideB); };
  67.     virtual float perimeter()const override { return Polygon::perimeter() * 2; };
  68.     virtual float area()const  override { return getSide(0) * getSide(1); }
  69. };
  70.  
  71. class Square : public Rectangle
  72. {
  73. public:
  74.     Square(float sideA) : Rectangle{ sideA, sideA } {};
  75. };
  76.  
  77. class Triangle : public Polygon
  78. {
  79. public:
  80.     Triangle(float sideA, float sideB, float sideC)
  81.     {
  82.         addSide(sideA).addSide(sideB).addSide(sideC);
  83.     };
  84.     virtual float area()const override
  85.     {
  86.         const float p{ perimeter() / 2 };
  87.         return sqrt(p * (p - getSide(0)) * (p - getSide(1)) * (p - getSide(2)));
  88.     }
  89. };
  90.  
  91. class Parent
  92. {
  93.     int val;
  94. public:
  95.     Parent(int valP) : val{ valP }
  96.     {
  97.         std::cout << "Parent constructed! for " << this << '\n';
  98.     };
  99.     Parent() : Parent{ 0 } {};
  100.     int getVal()const { return val; };
  101.     virtual const Parent& info()const { std::cout << "Parent with val = " << val << '\n'; return *this; };
  102.     virtual ~Parent();
  103. };
  104.  
  105. Parent::~Parent() { std::cout << "Parent destructed! for " << this << '\n'; };
  106.  
  107. class Child : public Parent
  108. {
  109.     int* storage;
  110.     int size;
  111. public:
  112.     Child(int sizeP, int valP) : Parent{ valP }, storage{ new int[sizeP] }, size{ sizeP }
  113.     {
  114.         std::cout << "Child constructed! for " << this << '\n';
  115.     };
  116.     Child() : Child{ 5, 42 } {};
  117.     virtual const Child& info()const override { std::cout << "Child with val = " << getVal() << '\n'; return *this; };
  118.     virtual ~Child()override { delete[] storage; std::cout << "Child destructed! for " << this << '\n'; };
  119. };
  120.  
  121. void infoPrint(Parent par)
  122. {
  123.     par.info();
  124. }
  125.  
  126. class ParentD
  127. {
  128. public:
  129.     void name() { std::cout << "Parent->name()\n"; };
  130.     //virtual ~ParentD() {};
  131. };
  132.  
  133. class ChildD : public ParentD
  134. {
  135.     int val{ 42 };
  136. public:
  137.     void print() { std::cout << "Child->print() " << val << '\n'; };
  138. };
  139.  
  140. void modVal(const int* val)
  141. {
  142.     int* ptr;
  143.     //ptr = val;
  144.     ptr = const_cast<int*>(val);
  145.     *ptr = 555;
  146.     std::cout << *ptr << '\n';
  147. }
  148.  
  149. void printVal(int* val)
  150. {
  151.     std::cout << "PrintVal() " << *val << '\n';
  152. }
  153.  
  154. ParentD* objGenerator()
  155. {
  156.     return (rand() % 2) ? new ParentD : new ChildD;
  157. }
  158.  
  159. int main()
  160. {
  161.     srand(time(nullptr));
  162.     ParentD* objs[10];
  163.     for (auto& obj : objs)
  164.     {
  165.         obj = objGenerator();
  166.     }
  167.  
  168.     for (auto& obj : objs)
  169.     {
  170.         std::cout << typeid(*obj).name() << '\n';
  171.         ChildD* cPtr{ (ChildD*)obj };
  172.  
  173.         if (cPtr)
  174.         {
  175.             std::cout << "Got ChildD object!";
  176.             cPtr->print();
  177.         }
  178.         else
  179.         {
  180.             std::cout << "Got ParentD object!";
  181.             obj->name();
  182.         }
  183.     }
  184.     /*int* ptr;
  185.     float fVal{ 36.6 };
  186.     ptr = (int*)&fVal;
  187.     std::cout << typeid(*ptr).name() << '\n';
  188.  
  189.     return 0; */
  190.  
  191.     //ParentD* parentPtr;
  192.     //ChildD* childPtr{ new ChildD };
  193.  
  194.     //parentPtr = childPtr;
  195.     //ChildD* cPtr;
  196.     //cPtr = dynamic_cast<ChildD*>(parentPtr);
  197.  
  198.     //parentPtr->name();
  199.     //cPtr->name();
  200.     //cPtr->print();
  201.     //
  202.     //delete childPtr;
  203.     //return 0;
  204.  
  205.     //Polygon* polygonPtr;
  206.  
  207.     //Rectangle* rectanglePtr{ new Rectangle{3,4} };
  208.     //polygonPtr = rectanglePtr;
  209.     //
  210.     //std::cout << typeid(polygonPtr).name() << '\n';
  211.     //std::cout << typeid(rectanglePtr).name() << '\n';
  212.  
  213.     //Triangle* trianglePtr{ new Triangle{3,4,5} };
  214.     //polygonPtr = trianglePtr;
  215.  
  216.     //std::cout << typeid(polygonPtr).name() << '\n';
  217.     //std::cout << typeid(trianglePtr).name() << '\n';
  218.  
  219.     //delete rectanglePtr;
  220.     //delete trianglePtr;
  221.  
  222.  
  223.  
  224.     //const_cast<>()
  225.     //static_cast<>()
  226.     //dynamic_cast<>()
  227.     //reinterpret_cast<>()
  228.     const int cIntVal{ 42 };
  229.     int intVal{ 33 };
  230.    
  231.     //std::cout << cIntVal << '\n';
  232.     ////modVal(&intVal);
  233.     //printVal(const_cast<int*>(&cIntVal));
  234.     //std::cout << cIntVal << '\n';
  235.  
  236.     /*float* fPtr;
  237.     fPtr = static_cast<float*>(&intVal);
  238.     intVal = static_cast<int>(36.6);
  239.  
  240.     std::cout << *fPtr << '\n';*/
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement