- •Int count;
- •Void SetCount ( int n)
- •Int GetCount(void)
- •Void changCount(int n)
- •Void ChangeCount(int n)
- •Int secondCount;
- •Void ChangCount(int n)
- •Int count;
- •Void fa(void);
- •Void fв(void);
- •Void fc(void);
- •Void f (void);
- •Void g(void);
- •Void Display(void)
- •Void Display(void)
- •Void Display(void);
- •Void tState::Display(void)
- •Void Display(void);
- •Void Display(void);
- •Void tPopulation::Display(void)
- •Наследуемые производным классом
- •Virtual void vf();
- •Virtual void vf();
- •Virtual void vf();
- •Virtual void Draw();
- •Virtual void Draw();
- •Virtual void Draw();
- •Int value;
- •Int GetValue(void) {return value; }
- •Int multiplier ;
- •Int GetValue(void) {return value *multiplier; }
- •Virtual void f1(void);
- •Void AbstractClass::f1(void)
- •Void MyClass::f2(void)
- •5://Неполные объявления класса
- •6: Class tElem ;
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);