Нужны программы на С++

Статус
В этой теме нельзя размещать новые ответы.
Наследование, виртуальные функции и полиморфизм:

Код:
#include <iostream>
#include <cstring>
using namespace std;

class TwoDimensionShape {
  double width;
  double height;
  char name[20];
public:

  TwoDimensionShape() {
    width = height = 0.0;
    strcpy(name, "unknown");
  }

  TwoDimensionShape(double w, double h, char *n) {
    width = w;
    height = h;
    strcpy(name, n);
  }

  TwoDimensionShape(double x, char *n) {
    width = height = x;
    strcpy(name, n);
  }

  void showDim() {
    cout << "Width and height are " << width << " and " << height << endl;
  }

  double getWidth() {
     return width;
  }
  double getHeight() {
     return height;
  }
  void setWidth(double w) {
     width = w;
  }
  void setHeight(double h) {
     height = h;
  }
  char *getName() {
     return name;
  }

  virtual double area() {   
    cout << "Error: area() must be overridden.\n"; 
    return 0.0; 
  }   

};

class Triangle : public TwoDimensionShape {
  char style[20]; // now private
public:

  Triangle() {
    strcpy(style, "unknown");
  }

  Triangle(char *str, double w,
           double h) : TwoDimensionShape(w, h, "triangle") {
    strcpy(style, str);
  }
   
  Triangle(double x) : TwoDimensionShape(x, "triangle") {
    strcpy(style, "isosceles"); 
  }

  double area() {
    return getWidth() * getHeight() / 2;
  }

  void showStyle() {
    cout << "Triangle is " << style << endl;
  }
};

class Rectangle : public TwoDimensionShape {
public:

 
  Rectangle(double w, double h) : TwoDimensionShape(w, h, "rectangle") { } 
 

  Rectangle(double x) : 
    TwoDimensionShape(x, "rectangle") { } 

  bool isSquare() {
    if(getWidth() == getHeight())
       return true;
    return false;
  }

  // This is another override of area().   
  double area() {
    return getWidth() * getHeight();
  }
};

int main() {

  TwoDimensionShape *shapes[5];
 
  shapes[0] = &Triangle("right", 8.0, 12.0); 
  shapes[1] = &Rectangle(10); 
  shapes[2] = &Rectangle(10, 4); 
  shapes[3] = &Triangle(7.0); 
  shapes[4] = &TwoDimensionShape(10, 20, "generic");
 
  for(int i = 0; i < 5; i++) { 
    cout << "object is " << shapes[i]->getName() << endl; 

    cout << "Area is " << shapes[i]->area() << endl; 
 
    cout << endl;   
  } 

  return 0;
}
 
В конструкторах лучше использовать списки инициализации:

Код:
TwoDimensionShape()
    : width(0)
    , height(0)
{
    strcpy(name, "unknown");
}

TwoDimensionShape(double w, double h, char *n)
    : width(w)
    , height(h)
{
    strcpy(name, n);
}

TwoDimensionShape(double x, char *n) 
    : width(x)
    , height(x)
{
    strcpy(name, n);
}
 
Пример перегрузки операторов:

Код:
#include <iostream>
using namespace std;

class MyClass {
  int x, y, z;
public:
  MyClass() {
     x = y = z = 0;
  }
  MyClass(int i, int j, int k) {
     x = i;
     y = j;
     z = k;
  }

  MyClass operator+(MyClass op2);
  MyClass operator=(MyClass op2);
  MyClass operator++();           

  void show() ;
} ;

// Overload +.
MyClass MyClass::operator+(MyClass op2)
{
  MyClass temp;

  temp.x = x + op2.x; // These are integer additions
  temp.y = y + op2.y; // and the + retains is original
  temp.z = z + op2.z; // meaning relative to them.
  return temp;
}

// Overload assignment.
MyClass MyClass::operator=(MyClass op2)
{
  x = op2.x; // These are integer assignments
  y = op2.y; // and the = retains its original
  z = op2.z; // meaning relative to them.
  return *this;
}

// Overload the prefix version of ++.
MyClass MyClass::operator++()
{
  x++; // increment x, y, and z
  y++;
  z++;
  return *this;
}

// Show X, Y, Z coordinates.
void MyClass::show()
{
  cout << x << ", ";
  cout << y << ", ";
  cout << z << endl;
}

int main()
{
  MyClass a(1, 2, 3), b(10, 10, 10), c;
  a.show();
  b.show();

  c = a + b;     // add a and b together
  c.show();

  c = a + b + c; // add a, b and c together
  c.show();

  c = b = a;     // demonstrate multiple assignment
  c.show();
  b.show();

  ++c;           // increment c
  c.show();

  return 0;
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху