ВУЗ:
Составители:
Рубрика:
21
Base(); // конструктор по умолчанию
Base(const Base&); // конструктор копирования
virtual ~Base(); // виртуальный деструктор
virtual void Show()=0; // чистая виртуальная функция
// другие чистые виртуальные функции
protected: // защищенные члены класса
private:
// часто остается пустым, иначе будет мешать будущим разработкам
};
class Derived: virtual public Base{
public:
Derived(); // конструктор по умолчанию
Derived(const Derived&); // конструктор копирования
Derived(параметры); // конструктор с параметрами
virtual ~Derived(); // виртуальный деструктор
void Show(); // переопределенная виртуальная функ-
ция
// другие
переопределенные виртуальные функции
// другие перегруженные операции
protected:
// используется вместо private, если ожидается наследование
private:
// используется для деталей реализации
};
Объект абстрактного класса не может быть формальным параметром
функции, однако формальным параметром может быть указатель на абст-
рактный класс. В этом случае появляется возможность передавать в вызы-
ваемую функцию в качестве фактического параметра
значение указателя
на производный объект, заменяя им указатель на абстрактный базовый
класс. Таким образом мы получаем полиморфные объекты.
Абстрактный метод может рассматриваться как обобщение переоп-
ределения. В обоих случаях поведение родительского класса изменяется
для потомка. Для абстрактного метода, однако, поведение просто не опре-
делено. Любое поведение задается в производном классе
.
Одно из преимуществ абстрактного метода является чисто концепту-
альным: программист может мысленно наделить нужным действием абст-
ракцию сколь угодно высокого уровня. Например, для геометрических фи-
гур мы можем определить метод Draw, который их рисует: треугольник
TTriangle, окружность TCircle, квадрат TSquare. Мы определим аналогич-
ный метод и для абстрактного родительского класса
TGraphObject. Однако
такой метод не может выполнять полезную работу, поскольку в классе
21 Base(); // конструктор по умолчанию Base(const Base&); // конструктор копирования virtual ~Base(); // виртуальный деструктор virtual void Show()=0; // чистая виртуальная функция // другие чистые виртуальные функции protected: // защищенные члены класса private: // часто остается пустым, иначе будет мешать будущим разработкам }; class Derived: virtual public Base{ public: Derived(); // конструктор по умолчанию Derived(const Derived&); // конструктор копирования Derived(параметры); // конструктор с параметрами virtual ~Derived(); // виртуальный деструктор void Show(); // переопределенная виртуальная функ- ция // другие переопределенные виртуальные функции // другие перегруженные операции protected: // используется вместо private, если ожидается наследование private: // используется для деталей реализации }; Объект абстрактного класса не может быть формальным параметром функции, однако формальным параметром может быть указатель на абст- рактный класс. В этом случае появляется возможность передавать в вызы- ваемую функцию в качестве фактического параметра значение указателя на производный объект, заменяя им указатель на абстрактный базовый класс. Таким образом мы получаем полиморфные объекты. Абстрактный метод может рассматриваться как обобщение переоп- ределения. В обоих случаях поведение родительского класса изменяется для потомка. Для абстрактного метода, однако, поведение просто не опре- делено. Любое поведение задается в производном классе. Одно из преимуществ абстрактного метода является чисто концепту- альным: программист может мысленно наделить нужным действием абст- ракцию сколь угодно высокого уровня. Например, для геометрических фи- гур мы можем определить метод Draw, который их рисует: треугольник TTriangle, окружность TCircle, квадрат TSquare. Мы определим аналогич- ный метод и для абстрактного родительского класса TGraphObject. Однако такой метод не может выполнять полезную работу, поскольку в классе
Страницы
- « первая
- ‹ предыдущая
- …
- 18
- 19
- 20
- 21
- 22
- …
- следующая ›
- последняя »