Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лек_3_слайды.doc
Скачиваний:
1
Добавлен:
17.11.2019
Размер:
457.73 Кб
Скачать

Void Display(void)

{ cout << sptr << ‘\n’; }

};

Объявленный класс похоже на те, что вы уже видели в этой главе. Конструктор TBase() вызывает strdup() для создания копии строкового аргумента в куче и присваивания адреса выделенного участка памяти закрытому члену sptr. Деструктор –TBase() освобождает эту память, когда объект TBase выходит из области видимости. Функция-член Display() отображает адресуемую строку с помощью встраиваемого оператора вывода в поток.

//бъявить объект типа TBase как

TBase state(“California”);

//затем вывести строку state оператором

state.Display();

Предположим, позже, при разработке программы, решили, что все подобные строки должны быть помечены строкой “state: ”. вы можете добиться этого с помощью следующих двух операторов:

cout << “state: ”;

state.Display();

Но придется сделать аналогичные модификации во всей программе. Лучшее решение – вывести новый класс из TBase и заместить наследованную функцию-член Display() модифицированной версией.

//можно написать производный класс //следующим образом:

class TState: public TBase {

public:

TState(const char *s): TBase(s ) {};

Void Display(void);

// Замещающая функция

};

Вдобавок к конструктору, в производном классе объявлена новая функция-член Display(). Поскольку она идентична члену Display() базового класса, то замещает наследованную.

//реализация замещающей функции-//члена

Void tState::Display(void)

{

cout << “state: ”;

// Новый оператор

TBase::Display();

/ Вызов замещенной функции-члена

}

Замещающая функция-член Display() выводит сначала “State: ”, затем вызывает Display() базового класса для совершения строки. Поставив TBase:: перед Display(), вы указали компилятору, что следует вызывать функцию-член из TBase.

//Объявление и использование объекта класса

TState state(“Ohio”);

State.Display();

//отображение строки

State:Ohio”.

Аналогичный трюк возможен и с конструкторами в производном классе. Предположим, вам необходимы несколько классов с различными именами штатов. Вы можете написать класс для каждого штата, подобный следующему:

class TPennsylvania: public TState {

public:

TPennsylvania(): TState(“Penn

sylvania”) {}

};

Класс TPennsylvania выводится из TState. Новый конструктор, объявленный без параметров, передает символьную строку “ TPennsylvania ” конструктору базового класса. В следующих строках

TPennsylvania Pennsylvania;

Pennsylvania.Display();

создается объект с именем Pennsylvania и выводится название штата.

Конструктор также могут иметь дополнительные параметры. Наверное, понадобится класс, сохраняющий кроме названия штата еще и плотность населения.

Можно организовать новый класс из TState:

class TPopulation: public TState {

private:

long population;

public:

TPennsylvania(long n, const char *name);

Void Display(void);

};

Конструктор TPopulation имеет длинный целый параметр плотности населения и символьный указатель на название штата. Вы можете реализовать конструктор следующим образом:

TPopulation::TPopulation(long n,

const char *name)

private:

long population;

public:

TPennsylvania(long n,

const char *name);

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