- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Результаты
- •Корректировка
- •Результаты
Корректировка
class MathEntity { char name[30];
protected: double result;
virtual void fill()=0; virtual void calc()=0;
public: MathEntity() {
} cout << "Created entity!" << endl;
virtual ~MathEntity() {
} cout << "Destroyed entity!" << endl;
Результаты
Created entity!
Created vector!
Created entity!
Created matrix!
Created entity!
Created matrix!
Created square matrix! Modulus = 13.9284 Destroyed vector! Destroyed entity! Geometric mean = 4.57455 Destroyed matrix! Destroyed entity!
Scalar product = 4.74292 Destroyed square matrix! Destroyed matrix!
Destroyed entity!
Виртуальныйконструктор?
Конструкторклассанеможетбыть виртуальным,хотяподобная функциональностьзачастую требуется.
Выход:созданиекода,заменяющего виртуальныеконструкторы.
"Виртуальныйконструктор"
class expr { // ...
public:
expr();
virtual expr* new_expr() { return new expr(); }
};
class conditional : public expr { // ...
public:
conditional();
expr* new_expr()
{ return new conditional(); }
};
Заменавиртуальным
конструкторам
void user(expr* p1, expr* p2)
{
expr* p3 = p1->new_expr(); expr* p4 = p2->new_expr(); // ...
}
Вданном случаеполиморфнымявляетсяобычный методкласса,которыйзаботитсяовызове необходимогоконструктора.
Такуюфункциональностьлучшезаменитьнашаблон
AbstractFactory илиFactoryMethod
Абстрактныйбазовыйкласс
(ABC)
Абстрактныйкласс(ABC)- этокласс, которыйопределёнтолькодля обеспечениянаследования характеристикпроизводными классами.
Экземплярыабстрактногоклассане должныинемогутбытьсозданы!
Абстрактныйбазовыйкласс
Shape
+draw()
+rotate(в angle : double)
Circle |
Square |
Абстрактныйбазовыйкласс
class shape {
// ...
public:
virtual void rotate(double) { error("shape::rotate"); }
virtual void draw()
{ error("shape::draw"): } // нельзя ни вращать, // ни рисовать фигуру
}; // ...
Абстрактныйбазовыйкласс
//бессмыслица:
//‘фигура вообще’ shape s;
Вданномпримере,несмотрянасоздание "заглушек"вметодах,естьнедостаток:всё ещёможносоздаватьэкземпляры "абстрактнойфигуры"shape.
Абстрактныйбазовыйкласс
// Абстрактный класс class shape {
// ...
public:
// чисто виртуальный метод
virtual void rotate(double) = 0;
// чисто виртуальный метод
virtual void draw() = 0;
};
Абстрактныйбазовыйкласс
//ошибка: попытка объявить
//объект абстрактного класса shape shape s;
class circle : public shape { int radius;
public:
//нормально:
//переопределение shape::rotate void rotate(double) { }
Абстрактныйбазовыйкласс
//нормально:
//переопределение shape::draw void draw();
circle(point p, double r); };
point p(10,10);
circle (p, 7); // нормально!
Абстрактностьинаследование
class X { public:
virtual void f() = 0; virtual void g() = 0;
};
//ошибка: описание объекта
//абстрактного класса X
X b;
Абстрактностьинаследование
class Y : public X {
// переопределение X::f void f();
};
//ошибка:
//описание объекта
//абстрактного класса Y
Y b;
Абстрактностьинаследование
class Z : public Y {
// переопределение X::g void g();
};
//нормально - все абстрактные
//методы перегружены
Z c;
Спасибозавнимание!