Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lect07.pdf
Скачиваний:
6
Добавлен:
06.02.2016
Размер:
421.2 Кб
Скачать

Корректировка

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;

Спасибозавнимание!

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]