Полиморфизм.
Тест
Задание №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 здесь
}
Текст программы:
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'; }
|
Результат работы программы:
