Advertisement
avr39ripe

PV913AnimalOstream

Aug 5th, 2020
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <math.h>
  5. #include <chrono>
  6.  
  7.  
  8.  
  9. class Polygon
  10. {
  11. protected:
  12.     std::vector<float> sides;
  13.  
  14. public:
  15.     Polygon& addSide(float size) { sides.push_back(size); return *this; };
  16.     Polygon& setSide(int sideId, float size)
  17.     {
  18.         sides[sideId] = size; return *this;
  19.     };
  20.     float getSide(int sideId)const { return sides[sideId]; };
  21.     virtual float perimeter()const
  22.     {
  23.         float per{ 0 };
  24.         for (const auto& side : sides)
  25.         {
  26.             per += side;
  27.         }
  28.         return per;
  29.     };
  30.     virtual float area()const;
  31.  
  32.     const Polygon& sidesInfo()const
  33.     {
  34.         for (int i{ 0 }; i < sides.size(); ++i)
  35.         {
  36.             std::cout << " Side " << char('A' + i) << " is " << sides[i] << " long\n";
  37.         }
  38.         return *this;
  39.     }
  40.  
  41.     std::string name()const
  42.     {
  43.         std::string nm{ typeid(*this).name() }; //"class Polygon"
  44.         return nm.substr(5);
  45.     }
  46.  
  47.     const Polygon& info()const
  48.     {
  49.         std::cout << name() << ":\n"
  50.             << " Perimeter: " << perimeter()
  51.             << " Area: " << area() << '\n';
  52.         sidesInfo();
  53.         std::cout << '\n';
  54.  
  55.         return *this;
  56.     }
  57.  
  58. };
  59.  
  60. float Polygon::area()const
  61. {
  62.     return -1;
  63. }
  64.  
  65. class Rectangle : public Polygon
  66. {
  67. public:
  68.     Rectangle(float sideA, float sideB) { addSide(sideA); addSide(sideB); };
  69.     virtual float perimeter()const override { return Polygon::perimeter() * 2; };
  70.     virtual float area()const  override { return getSide(0) * getSide(1); }
  71. };
  72.  
  73. class Square : public Rectangle
  74. {
  75. public:
  76.     Square(float sideA) : Rectangle{ sideA, sideA } {};
  77. };
  78.  
  79. class Triangle : public Polygon
  80. {
  81. public:
  82.     Triangle(float sideA, float sideB, float sideC)
  83.     {
  84.         addSide(sideA).addSide(sideB).addSide(sideC);
  85.     };
  86.     virtual float area()const override
  87.     {
  88.         const float p{ perimeter() / 2 };
  89.         return sqrt(p * (p - getSide(0)) * (p - getSide(1)) * (p - getSide(2)));
  90.     }
  91. };
  92.  
  93. class Parent
  94. {
  95.     int val;
  96. public:
  97.     Parent(int valP) : val{ valP }
  98.     {
  99.         std::cout << "Parent constructed! for " << this << '\n';
  100.     };
  101.     Parent() : Parent{ 0 } {};
  102.     int getVal()const { return val; };
  103.     virtual const Parent& info()const { std::cout << "Parent with val = " << val << '\n'; return *this; };
  104.     virtual ~Parent();
  105. };
  106.  
  107. Parent::~Parent() { std::cout << "Parent destructed! for " << this << '\n'; };
  108.  
  109. class Child : public Parent
  110. {
  111.     int* storage;
  112.     int size;
  113. public:
  114.     Child(int sizeP, int valP) : Parent{ valP }, storage{ new int[sizeP] }, size{ sizeP }
  115.     {
  116.         std::cout << "Child constructed! for " << this << '\n';
  117.     };
  118.     Child() : Child{ 5, 42 } {};
  119.     virtual const Child& info()const override { std::cout << "Child with val = " << getVal() << '\n'; return *this; };
  120.     virtual ~Child()override { delete[] storage; std::cout << "Child destructed! for " << this << '\n'; };
  121. };
  122.  
  123. void infoPrint(Parent par)
  124. {
  125.     par.info();
  126. }
  127.  
  128. class ParentD
  129. {
  130. public:
  131.     void name() { std::cout << "Parent->name()\n"; };
  132.     virtual ~ParentD() {};
  133. };
  134.  
  135. class ChildD : public ParentD
  136. {
  137.     int val{ 42 };
  138. public:
  139.     void print() { std::cout << "Child->print() " << val << '\n'; };
  140. };
  141.  
  142. void modVal(const int* val)
  143. {
  144.     int* ptr;
  145.     //ptr = val;
  146.     ptr = const_cast<int*>(val);
  147.     *ptr = 555;
  148.     std::cout << *ptr << '\n';
  149. }
  150.  
  151. void printVal(int* val)
  152. {
  153.     std::cout << "PrintVal() " << *val << '\n';
  154. }
  155.  
  156. ParentD* objGenerator()
  157. {
  158.     return (rand() % 2) ? new ParentD : new ChildD;
  159. }
  160.  
  161. class Animal
  162. {
  163. protected:
  164.     std::string name;
  165. public:
  166.     Animal(std::string nameP) : name{ nameP } {};
  167.     virtual std::ostream& print(std::ostream& out)const
  168.     {
  169.         out << "Base Animal " << name << '\n';
  170.         return out;
  171.     };
  172.  
  173.     friend std::ostream& operator<<(std::ostream& out, const Animal& obj);
  174. };
  175.  
  176. std::ostream& operator<<(std::ostream& out, const Animal& obj)
  177. {
  178.     return obj.print(out);
  179. }
  180.  
  181. class Cat : public Animal
  182. {
  183.     std::string meh;
  184. public:
  185.     Cat(std::string nameP, std::string mehP) : Animal{ nameP }, meh{ mehP } {};
  186.     virtual std::ostream& print(std::ostream& out)const override
  187.     {
  188.         out << "The Cat named " << name << " with " << meh << " meh!\n";
  189.         return out;
  190.     };
  191.     void meow() { std::cout << "MEOW!\n"; };
  192. };
  193.  
  194. class Dog : public Animal
  195. {
  196.     int weight;
  197. public:
  198.     Dog(std::string nameP, int weightP) : Animal{ nameP }, weight{ weightP} {};
  199.     virtual std::ostream& print(std::ostream& out)const override
  200.     {
  201.         out << "The Dog named " << name << " weight is: " << weight << '\n';
  202.         return out;
  203.     };
  204.     void woff() { std::cout << "WOFF!\n"; };
  205. };
  206.  
  207. int main()
  208. {
  209.     Animal animal{ "Meduza" };
  210.     Dog dog{ "Bobik", 60 };
  211.     Cat cat{ "Murka", "white" };
  212.     std::cout << animal << '\n';
  213.     std::cout << dog << '\n';
  214.     std::cout << cat << '\n';
  215.  
  216.     //Cat* catPtr{ new Cat };
  217.     //Dog* dogPtr{ new Dog };
  218.     //Animal* animals[2]{catPtr, dogPtr};
  219.  
  220.  
  221.     //Dog* dPtr{ static_cast<Dog*>(animals[1]) };
  222.     //dPtr->name();
  223.     //dPtr->woff();
  224.  
  225.     /*for (const auto& animal : animals)
  226.     {
  227.         animal->name();
  228.  
  229.         Cat* cPtr{ static_cast<Cat*>(animal) };
  230.         if (cPtr)
  231.         {
  232.             cPtr->meow();
  233.         }
  234.  
  235.         Dog* dPtr{ static_cast<Dog*>(animal) };
  236.         if (dPtr)
  237.         {
  238.             dPtr->woff();
  239.         }
  240.     }*/
  241.  
  242.  
  243.     return 0;
  244.     /*srand(time(nullptr));
  245.     ParentD* objs[10];
  246.     for (auto& obj : objs)
  247.     {
  248.         obj = objGenerator();
  249.     }
  250.  
  251.     for (auto& obj : objs)
  252.     {
  253.         std::cout << typeid(*obj).name() << '\n';
  254.         ChildD* cPtr{ (ChildD*)obj };
  255.  
  256.         if (cPtr)
  257.         {
  258.             std::cout << "Got ChildD object!";
  259.             cPtr->print();
  260.         }
  261.         else
  262.         {
  263.             std::cout << "Got ParentD object!";
  264.             obj->name();
  265.         }
  266.     }*/
  267.     /*int* ptr;
  268.     float fVal{ 36.6 };
  269.     ptr = (int*)&fVal;
  270.     std::cout << typeid(*ptr).name() << '\n';
  271.  
  272.     return 0; */
  273.  
  274.     //ParentD* parentPtr;
  275.     //ChildD* childPtr{ new ChildD };
  276.  
  277.     //parentPtr = childPtr;
  278.     //ChildD* cPtr;
  279.     //cPtr = dynamic_cast<ChildD*>(parentPtr);
  280.  
  281.     //parentPtr->name();
  282.     //cPtr->name();
  283.     //cPtr->print();
  284.     //
  285.     //delete childPtr;
  286.     //return 0;
  287.  
  288.     //Polygon* polygonPtr;
  289.  
  290.     //Rectangle* rectanglePtr{ new Rectangle{3,4} };
  291.     //polygonPtr = rectanglePtr;
  292.     //
  293.     //std::cout << typeid(polygonPtr).name() << '\n';
  294.     //std::cout << typeid(rectanglePtr).name() << '\n';
  295.  
  296.     //Triangle* trianglePtr{ new Triangle{3,4,5} };
  297.     //polygonPtr = trianglePtr;
  298.  
  299.     //std::cout << typeid(polygonPtr).name() << '\n';
  300.     //std::cout << typeid(trianglePtr).name() << '\n';
  301.  
  302.     //delete rectanglePtr;
  303.     //delete trianglePtr;
  304.  
  305.  
  306.  
  307.     //const_cast<>()
  308.     //static_cast<>()
  309.     //dynamic_cast<>()
  310.     //reinterpret_cast<>()
  311.     const int cIntVal{ 42 };
  312.     int intVal{ 33 };
  313.    
  314.     //std::cout << cIntVal << '\n';
  315.     ////modVal(&intVal);
  316.     //printVal(const_cast<int*>(&cIntVal));
  317.     //std::cout << cIntVal << '\n';
  318.  
  319.     /*float* fPtr;
  320.     fPtr = static_cast<float*>(&intVal);
  321.     intVal = static_cast<int>(36.6);
  322.  
  323.     std::cout << *fPtr << '\n';*/
  324.     //volatile
  325.  
  326. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement