Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- #include <math.h>
- #include <chrono>
- class Polygon
- {
- protected:
- std::vector<float> sides;
- public:
- Polygon& addSide(float size) { sides.push_back(size); return *this; };
- Polygon& setSide(int sideId, float size)
- {
- sides[sideId] = size; return *this;
- };
- float getSide(int sideId)const { return sides[sideId]; };
- virtual float perimeter()const
- {
- float per{ 0 };
- for (const auto& side : sides)
- {
- per += side;
- }
- return per;
- };
- virtual float area()const;
- const Polygon& sidesInfo()const
- {
- for (int i{ 0 }; i < sides.size(); ++i)
- {
- std::cout << " Side " << char('A' + i) << " is " << sides[i] << " long\n";
- }
- return *this;
- }
- std::string name()const
- {
- std::string nm{ typeid(*this).name() }; //"class Polygon"
- return nm.substr(5);
- }
- const Polygon& info()const
- {
- std::cout << name() << ":\n"
- << " Perimeter: " << perimeter()
- << " Area: " << area() << '\n';
- sidesInfo();
- std::cout << '\n';
- return *this;
- }
- };
- float Polygon::area()const
- {
- return -1;
- }
- class Rectangle : public Polygon
- {
- public:
- Rectangle(float sideA, float sideB) { addSide(sideA); addSide(sideB); };
- virtual float perimeter()const override { return Polygon::perimeter() * 2; };
- virtual float area()const override { return getSide(0) * getSide(1); }
- };
- class Square : public Rectangle
- {
- public:
- Square(float sideA) : Rectangle{ sideA, sideA } {};
- };
- class Triangle : public Polygon
- {
- public:
- Triangle(float sideA, float sideB, float sideC)
- {
- addSide(sideA).addSide(sideB).addSide(sideC);
- };
- virtual float area()const override
- {
- const float p{ perimeter() / 2 };
- return sqrt(p * (p - getSide(0)) * (p - getSide(1)) * (p - getSide(2)));
- }
- };
- class Parent
- {
- int val;
- public:
- Parent(int valP) : val{ valP }
- {
- std::cout << "Parent constructed! for " << this << '\n';
- };
- Parent() : Parent{ 0 } {};
- int getVal()const { return val; };
- virtual const Parent& info()const { std::cout << "Parent with val = " << val << '\n'; return *this; };
- virtual ~Parent();
- };
- Parent::~Parent() { std::cout << "Parent destructed! for " << this << '\n'; };
- class Child : public Parent
- {
- int* storage;
- int size;
- public:
- Child(int sizeP, int valP) : Parent{ valP }, storage{ new int[sizeP] }, size{ sizeP }
- {
- std::cout << "Child constructed! for " << this << '\n';
- };
- Child() : Child{ 5, 42 } {};
- virtual const Child& info()const override { std::cout << "Child with val = " << getVal() << '\n'; return *this; };
- virtual ~Child()override { delete[] storage; std::cout << "Child destructed! for " << this << '\n'; };
- };
- void infoPrint(Parent par)
- {
- par.info();
- }
- class ParentD
- {
- public:
- void name() { std::cout << "Parent->name()\n"; };
- //virtual ~ParentD() {};
- };
- class ChildD : public ParentD
- {
- int val{ 42 };
- public:
- void print() { std::cout << "Child->print() " << val << '\n'; };
- };
- void modVal(const int* val)
- {
- int* ptr;
- //ptr = val;
- ptr = const_cast<int*>(val);
- *ptr = 555;
- std::cout << *ptr << '\n';
- }
- void printVal(int* val)
- {
- std::cout << "PrintVal() " << *val << '\n';
- }
- ParentD* objGenerator()
- {
- return (rand() % 2) ? new ParentD : new ChildD;
- }
- int main()
- {
- srand(time(nullptr));
- ParentD* objs[10];
- for (auto& obj : objs)
- {
- obj = objGenerator();
- }
- for (auto& obj : objs)
- {
- std::cout << typeid(*obj).name() << '\n';
- ChildD* cPtr{ (ChildD*)obj };
- if (cPtr)
- {
- std::cout << "Got ChildD object!";
- cPtr->print();
- }
- else
- {
- std::cout << "Got ParentD object!";
- obj->name();
- }
- }
- /*int* ptr;
- float fVal{ 36.6 };
- ptr = (int*)&fVal;
- std::cout << typeid(*ptr).name() << '\n';
- return 0; */
- //ParentD* parentPtr;
- //ChildD* childPtr{ new ChildD };
- //parentPtr = childPtr;
- //ChildD* cPtr;
- //cPtr = dynamic_cast<ChildD*>(parentPtr);
- //parentPtr->name();
- //cPtr->name();
- //cPtr->print();
- //
- //delete childPtr;
- //return 0;
- //Polygon* polygonPtr;
- //Rectangle* rectanglePtr{ new Rectangle{3,4} };
- //polygonPtr = rectanglePtr;
- //
- //std::cout << typeid(polygonPtr).name() << '\n';
- //std::cout << typeid(rectanglePtr).name() << '\n';
- //Triangle* trianglePtr{ new Triangle{3,4,5} };
- //polygonPtr = trianglePtr;
- //std::cout << typeid(polygonPtr).name() << '\n';
- //std::cout << typeid(trianglePtr).name() << '\n';
- //delete rectanglePtr;
- //delete trianglePtr;
- //const_cast<>()
- //static_cast<>()
- //dynamic_cast<>()
- //reinterpret_cast<>()
- const int cIntVal{ 42 };
- int intVal{ 33 };
- //std::cout << cIntVal << '\n';
- ////modVal(&intVal);
- //printVal(const_cast<int*>(&cIntVal));
- //std::cout << cIntVal << '\n';
- /*float* fPtr;
- fPtr = static_cast<float*>(&intVal);
- intVal = static_cast<int>(36.6);
- std::cout << *fPtr << '\n';*/
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement