Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

13.2.1. Абстрактные функции

Абстрактная функция объявляется без тела с обязательным ключевым

словом abstract:

C#, Java

abstruct тип-возвр-значения имя-функц (список-парам);

С++, C++/CLI.

virtual тип-возвр-значения имя-функц (список-парам}=0;

где

abstract - ключевое слово, указывающее компилятору об объявлении

абстрактной функции,

virtual - ключевое слово, указывающее с "=0" компилятору об объявлении

чистой виртуальной функции,

имя-функц - это имя абстрактной функции,

тип- возвр-значения - тип возвращаемого значения абстрактной функции,

список-парам - список типов параметров абстрактной функции.

При объявлении абстрактной функции в классе необходимо указать

требуемый доступ - protected или public. Поскольку абстрактная функция

должна переопределяться в порождённом классе, она не может иметь доступ

private.

Абстрактными функциями представляют одноимённые функции по-

рождённых классов, тела которых могут несколько отличаться для объектов

различных порождаемых классов. Как видим, абстрактная функция схожа с

виртуальной функцией, поскольку требует переопределения, но в отличие от

виртуальной функции она не содержит тело.

Обратим ещё раз внимание, что в языках С++ и C++/CLI абстрактная

виртуальная объявляется как чистая виртуальная функция, не содержащая

тело и определяемая как

virtual тип-возвр-значения имя-функц (список-парам)=0;

Только будучи переопределённой, абстрактная функция может вызы-

ваться в порождённом классе.

13.2.2. Абстрактные классы

Класс, содержащий хотя бы одну абстрактную функцию, называется

абстрактным классо.м и содержат перед словом c!ass ключевое слово abstract.

Поскольку абстрактный класс должен наследоваться, то он, разумеет-

ся, не должен иметь модификаторы sealed и final. Содержа не доопределён-

ные абстрактные функции, абстрактный класс может применяться только для

порождения из него иных классов, среди которых опять могут возникнуть

абстрактные классы, если в них не переопределяются наследуемые абстракт-

ные функции. Из абстрактных классов, в виду их полной неопределённости,

нельзя создавать объекты. Объекты создаются из порождённых классов.

Обязательно включая хотя бы одну абстрактную функцию, абстракт-

ный класс, как и обычный класс, может содержать множество обычных

функций с телами, события и другие данные, которые удовлетворяют функ-

циональности всех объектов порождённых классов, Абстрактные же функ-

ции должны обязательно переопределяться в порождённых классах, отобра-

жая специфику их объектов.

Пример 13.2.2.1 иллюстрирует абстрактные классы и абстрактные

функции.

Пример 13.2.2.1. Абстрактные классы и функции

////////////////////

//C++

#include <stdafx.h>

using namespace System;

// Абстрактный класс

class А

{

protected: // Объявление чистой виртуальной функции F()

virtual void F ( }= О;

>;

class В : public А

{

public: // Наследуемая чистая виртуальная функция F() переопределяется

Void f ( ) {Console::WriteLine ("b:: f");}

>;

class С : public В

{

public: // Наследуемая чистая виртуальная функция F() не переопределяется

//void F ( ) {Console::WriteLine ("C:: F");}

>;

class D : public А

{

public: // Наследуемая чистая виртуальная функция F() переопределяется