Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет кдз программирование.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
158.59 Кб
Скачать

Полиморфизм.

Тест

Задание №1

Каждая из следующих программ имеет какую-то ошибку. Ваша задача состоит в том, чтобы найти эту ошибку визуально (не запуская код).

a)

#include <iostream>

class Parent {

protected:

int m_value;

public:

Parent (int value): m_value(value) {}

const char* getName () const {return "Parent";}

};

class Child: public Parent {

public:

Child (int value): Parent(value) {}

const char* getName () const {return "Child";}

};

int main () {

Child ch (7);

Parent &p = ch;

std::cout << p.getName();

return 0;

Ответ: нет закрывающей скобки "}" в конце блока main.

b)

#include <iostream>

class Parent {

protected:

int m_value;

public:

Parent (int value): m_value(value) {}

virtual const char* getName () {return "Parent";}

};

class Child: public Parent {

public:

Child (int value): Parent(value) { }

virtual const char* getName () const {return "Child";}

};

int main () {

Child ch (7);

Parent &p = ch;

std::cout << p.getName ();

return 0;

}

Ответ: нет ошибок. Вернет Parent.

c)

#include <iostream>

class Parent {

protected:

int m_value;

public:

Parent (int value): m_value(value) {}

virtual const char* getName() { return "Parent"; }

};

class Child: public Parent

{

public:

Child (int value): Parent(value) {}

virtual const char* getName () override {return "Child";}

};

int main () {

Child ch (7);

Parent p = ch;

std::cout << p.getName ();

return 0;

}

Ответ: нет ошибок. Вернет Parent.

d)

#include <iostream>

class Parent final {

protected:

int m_value;

public:

Parent (int value): m_value(value) {}

virtual const char* getName () {return "Parent";}

};

class Child: public Parent {

public:

Child (int value): Parent(value) {}

virtual const char* getName () override {return "Child";}

};

int main () {

Child ch (7);

Parent &p = ch;

std::cout << p.getName();

return 0; }

Ответ: главный класс не может инициализировать ключевым словом final, так как он наследуется, а final исключает наследование класса.

e)

#include <iostream>

class Parent {

protected:

int m_value;

public:

Parent (int value): m_value(value) { }

virtual const char* getName () {return "Parent";}

};

class Child: public Parent {

public:

Child (int value): Parent(value){}

virtual const char* getName () = 0;

};

const char* Child::getName() {

return "Child";

}

int main () {

Child ch (7);

Parent &p = ch;

std::cout << p.getName ();

return 0;

}

Ответ: невозможно использование объекта абстрактного класса Child.

f)

#include <iostream>

class Parent {

protected:

int m_value;

public:

Parent (int value): m_value(value) {}

virtual const char* getName () {return "Parent";}

};

class Child: public Parent {

public:

Child (int value): Parent(value) {}

virtual const char* getName () {return "Child"; }

};

int main () {

Child *ch = new Child (7);

Parent *p = ch;

std::cout << p->getName();

delete p;

return 0;

}

Ответ: нет ошибок. Вернет Child.

Задание №2

a) Создайте абстрактный класс Shape. Этот класс должен иметь три метода:

- чистую виртуальную функцию print() с параметром типа std::ostream;

- перегрузку operator<<;

- пустой виртуальный деструктор.

b) Создайте два класса: Triangle и Circle, которые наследуют класс Shape.

Triangle должен иметь 3 точки в качестве переменных-членов.

Circle должен иметь одну центральную точку и целочисленный радиус в качестве переменных-членов. Перегрузите функцию print ().

c) Используя код из предыдущих заданий (классы Point, Shape, Circle и Triangle) завершите следующую программу:

#include <iostream>

#include <vector>

int main () {

std::vector<Shape*> v;

v.push_back(new Circle(Point(1, 2, 3), 7));

v.push_back(new Triangle(Point(1, 2, 3), Point(4, 5, 6), Point(7, 8, 9)));

v.push_back(new Circle(Point(4, 5, 6), 3));

// Вывод элементов вектора v здесь

std::cout << "The largest radius is: " << getLargestRadius(v) << '\n'; // реализуйте эту функцию

// Удаление элементов вектора v здесь

}

Текст программы:

  1. b)

#include <iostream>

#include <fstream>

#include <math.h>

using namespace std;

class Point {

private:

int m_x = 0;

int m_y = 0;

int m_z = 0;

public:

Point() {};

Point(int x, int y, int z) : m_x(x), m_y(y), m_z(z) {}

friend std::ostream& operator<<(std::ostream& out, const Point& p) {

out << "Point(" << p.m_x << ", " << p.m_y << ", " << p.m_z << ")";

return out;

}

};

class Shape {

public:

Point p;

Shape() {}

Shape(Point& pp) {

p = pp;

}

virtual void print(ostream& a) = 0;

friend ostream& operator<<(ostream& o, const Shape& s) {

o << s.p;

return o;

}

virtual ~Shape() {};

};

class Circle : public Shape {

private:

int radius;

public:

Circle(Point& c, int rd) : Shape(c) {

radius = rd;

}

friend ostream& operator<<(ostream& ou, const Circle& cr) {

ou << "Circle (" << cr.p << ", radius " << cr.radius << ")" << endl;

return ou;

}

void print(ostream& a) {};

};

class Triangle : public Shape {

public:

Point a, b, c;

Triangle(Point aa, Point bb, Point cc) {

a = aa;

b = bb;

c = cc;

}

friend ostream& operator<<(ostream& au, const Triangle& tr) {

au << "Triangle (" << tr.a << tr.b << tr.c << ")";

return au;

}

void print(ostream& a) {};

};

int main() {

Point pnt(1, 2, 3);

Circle cp(pnt, 7);

cout << cp;

Point p1(10, 9, 4);

Point p2(7, 5, 2);

Point p3(8, 2, 3);

Triangle tr(p1, p2, p3);

cout << tr;

}

Результат работы программы:

c)

#include <iostream>

#include <fstream>

#include <vector>

#include <math.h>

using namespace std;

class Point {

private:

int m_x = 0;

int m_y = 0;

int m_z = 0;

public:

Point() {};

Point(int x, int y, int z) : m_x(x), m_y(y), m_z(z) {}

friend std::ostream& operator<<(std::ostream& out, const Point& p) {

out << "Point(" << p.m_x << ", " << p.m_y << ", " << p.m_z << ")";

return out;

}

};

class Shape {

public:

Point p;

Shape() {}

Shape(Point& pp) {

p = pp;

}

virtual void print(ostream& a) = 0;

friend ostream& operator<<(ostream& o, const Shape& s) {

o << s.p;

return o;

}

virtual ~Shape() {};

};

class Circle : public Shape {

private:

int radius;

public:

Circle(Point& c, int rd) : Shape(c) {

radius = rd;

}

friend ostream& operator<<(ostream& ou, const Circle& cr) {

ou << "Circle (" << cr.p << ", radius " << cr.radius << ")" << endl;

return ou;

}

int returnRadius() { return radius; }

void print(ostream& a) {};

};

class Triangle : public Shape {

public:

Point a, b, c;

Triangle(Point aa, Point bb, Point cc) {

a = aa;

b = bb;

c = cc;

}

friend ostream& operator<<(ostream& au, const Triangle& tr) {

au << "Triangle (" << tr.a << tr.b << tr.c << ")" << endl;

return au;

}

void print(ostream& a) {};

};

int getLargestRadius(std::vector<Shape*> vctr) {

int max = 0;

for (int i = 0; i < vctr.size(); i++) {

Circle* cc = dynamic_cast<Circle*>(vctr[i]);

if (cc && cc->returnRadius() > max)

max = cc->returnRadius();

}

return max;

}

int main() {

Point p(1, 2, 3);

Circle cir1(p, 7);

cout << cir1;

Point p1(10, 9, 4);

Point p2(7, 5, 2);

Point p3(8, 2, 3);

Point p4(4, 5, 6);

Triangle trn(p1, p2, p3);

Circle cir2(p4, 3);

cout << trn << endl;

std::vector<Shape*> v;

Shape* obj;

obj = &cir1;

v.push_back(obj);

obj = &trn;

v.push_back(obj);

obj = &cir2;

v.push_back(obj);

cout << "Vector: " << endl;

for (int i = 0; i < v.size(); i++) {

Circle* cir = dynamic_cast<Circle*>(v[i]);

if (cir)

cout << *cir;

else {

Triangle* trng = dynamic_cast<Triangle*>(v[i]);

cout << *trng;

}

}

std::cout << "The largest radius is: " << getLargestRadius(v) << '\n';

}

Результат работы программы: