Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Использование конструкторов и деструкторов

ПРИмер

Пример

Void Display(void)

Пример

Квалификация доступа к отдельным членам

Спецификатор базового класса потенциально влияет на все наследуемые члены.

class A {

public:

int x;

A() { count <<

“Inside A’ s constructor\n”; x = 0; }

{ cout << ”x = = ” << x << ‘\n’; }

};

Допустим: класс В наследует А в качестве закрытого базового класса:

class B: private A {

public:

B(): A() {cout <<

“Inside B’s constructor\n”; }

};

Т.к. класс А - закрытый в B, все прежде открытые в А члены теперь закрытые в B, след-но, во всех последующих производных от В классах или внешних по отношению к В операторах нельзя вызвать функцию-член Display(), наследованную из класса А.

//выполняется правильно:

A objectA;

objectA.Display();

// Display() недоступна).

B objectB;

objectB.Display();

//???? Display() закрыта в B

 

можно выборочно квалифицировать один или несколько из наследуемых членов

Если вы хотите сделать закрытыми в производном классе только некоторые из наследуемых членов, можно выборочно квалифицировать один или несколько из них. Предположим, вы хотите, чтобы открытый в А целочисленный член x стал закрытым в B, а открытая в А функция Display() осталось бы открытой в B так, чтобы внешние операторы могли ее вызывать. Для этого укажите базовый класс А закрытым в B, как это уже делалось ранее, а в открытой секции В квалифицируйте наследуемые члены, которые вы хотели бы оставит открытыми:

//открытый в А член x стал закрытым в B

//открытая в А ф-ция Display() //осталось открытой в B

class B: private A {

public:

A::Display;

// Выборочно уточнение Display()

// Display() осталась открытой

// x станет закрытым членом класса В

B(): A() { cout <<

”Inside B’s constructor\n”; }

};

Выражение А::Display; в открытой секции класса В указывает компилятору, что этот член, объявленный в классе А, должен остаться открытым. Наследуемый целочисленный член x станет закрытым членом класса В, как и прежде, однако функция-член Display() останется открытой. Предыдущая попытка вызова Display() для объекта класса В теперь скомпилируется и выполнится правильно:

//Теперь правильно!

B objectB;

objectB.Display();

// Display() – открытый член B

в производном классе обычно необходим конструктор, если он определен и в базовом классе

 

конструктор базового класса должен вызываться, чтобы инициализировать все данные-члены в базовых классах.

 

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

 

ПРИМЕР базового класса

 

class TBase {

private:

//указатель basep на строку символов

char *basep;

public:

//создание копии строкового

//аргумента в виде динамической

// переменной с присвоением адреса

// выделенной памяти указателю basep.

TBase(const char *s)

{ basep = strdup(s); }

~TBase() { delete basep; }

const char *GetStr(void)

{ return basep; }

};

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

 

// создание объекта

TBase president(“George Washington”);

//конструктору класса передается //строка “ George Washington ”

//создание копии строки и //присваивание ее адреса члену basep //объекта president

 

//Для отображения строки, //хранящейся в president

cout << president. GetStr();

Когда president выходит из области видимости, деструктор класса удаляет строку, хранящуюся в куче.

Рис. 3.7. иллюстрирует предоставление president в памяти.

 

Рис.3.7. Представление объекта

<== предыдущая лекция | следующая лекция ==>
Замечание. Открытые члены в базовом | TD president(
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 359; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.