Студопедия

КАТЕГОРИИ:


Архитектура-(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)

TBase и TDerived

2)

Или

ПРИМЕР

ПРИМЕР

class TDerived: public TBase {

//все открытые члены TBase //становится открытыми членами в //TDerived.

//Все закрытые члены TBase //остаются закрытыми в своем //первоначально объявленном классе, //и в TDerived нельзя получить //доступ к этим членам TBase.

 

Вы также можете объявить базовый класс закрытым:

class TDerived: private TBase {

//все открытые члены TBase //становятся закрытыми членами в //TDerived.

//Последующие наследования //TDerived не смогут получить //доступ к любым членам TBase.

 

Позже вы ознакомитесь с третьим типом спецификатора класса – protected.

 

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

Ознакомимся подобнее с конструктором класса TDerive – TDerive().

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

конструктор производного класса должен вызывать конструктор базового класса.

(С++ может автоматически вставлять конструкторы и деструкторы по умолчанию, а также вызывать их, когда это необходимо для многих классов.)

в TDerived в строке

TDerived(): TBase() {}

объявится конструктор производного класса TDerived() и вызывается конструктора базового класса с помощью специальных обозначений TBase().

НЕльзя вызвать конструкторы базового классов в операторах; надо вызвать их, указывая их имена вслед за объявлением конструктора производного класса.

ПРИМЕР: новый конструктор TDerived не выполняет никаких действий и, соответственно, определен пустой встраиваемой функцией с пустой парой скобок.

Но в конструкторе могут выполняться операторы, в таком случае конструктор TDerived можно объявить встраиваемым следующим образом:

1)

TDerived(): TBase()

{ cout << “I am being

initialized\n”; }

Конечно, вы не обязаны реализовать конструкторы производных классов страиваемыми и можете также объявить TDerived() следующим образом:

сlass TDerived: public TBase {

Public:

TDerived();

// Конструктор производного класса

void ChangeCount(int n)

{SetCount(GetCount() + n); }

};

 

реализация конструктора TDerived() отдельно.

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

TDerived::TDerived()

// Заголовок конструктора

: TBase()

// Вызов конструктора базового

//класса, т.к. класс TDerived выводится с класса TBase

{

// В этом месте выполняется

//операторы конструктора

}

Первая строка реализации конструктора начинается с имени класса и оператора разрешения области видимости (TDerived::), за которым следует имя конструктора (TDerived()). Поскольку класс TDerived выводится с класса TBase, новый конструктор должен вызывать конструктор базового класса имена так, как это было продемонстрировано. Этот вызов обеспечивает инициализацию соответствующим образом всех членов, наследованных с базового класса. В данном случае конструктор базового класса устанавливает закрытый член count равным нулю.

 

Использование функций членов производного класса

Производный класс наследует count из базового класса.

Конечно, поскольку count закрыт в TBase, в TDerived нельзя получить к нему непосредственный доступ. Только члены класса могут иметь доступ к закрытым членам этого же класса.

TDerived можно объявить свои собственные закрытые члены.

пример, рассмотрим класс, объявленный следующим образом:

class TDerived: public TBase {

private:

// новый закрытый член

int secondCount;

public:

TDerived();

// Конструктор производного класса

// новая ф-ция-член,т.к. Count закрыт

void ChangCount(int n)

{ SetCount(GetCount() + n); }

};

TDerived наследует свойства TBase, включая закрытый член базового класса count.

В новом классе добавился новый закрытый член secondCount.

Для инициализации закрытый член secondCount новый конструктор можно реализовать так:

TDerived:: TDerived()

// Заголовок конструктора

: TBase()

// Инициализация данных-членов

//TBase

{

secondCount 0;

// Инициализация данных-членов

//TDerived

}

Вызов конструктора TBase() инициализирует объекта класса TBase. Оператор присваивания члену secondCount в конструкторе производного класса инициализирует объект класса TDerived. Конструктор базового класса должен вызываться первым, что обеспечит инициализацию всех наследуемых членов до того, как будут инициализированы члены производного класса.

Рис. 3.5 демонстрирует родственные взаимосвязи между классами TBase и TDerived.

В новом классе TDerived также объявлена открытая функция-член ChangeCount для увеличения и уменьшения значения члена Count, наследованного из класса TBase. Конечно, поскольку count закрыт в классе TBase, в функции ChangeCount() нельзя не получить непосредственный доступ к этому члену.

нельзя написать функцию-член ChangeCount() следующим образом:

void ChangeCount(int n)

{ count += n; } //??

Этот оператор вызовет сообщение об ошибке при компиляции, поскольку член Count закрыт в базовом классе, и только член TBase могут иметь непосредственный доступ к count. Для изменения члена count, функция-член ChangeCount() может вызвать незакрытые наследуемые функции-члены, подобные SetCount() и GetCount():

void ChangeCount(int n)

{ SetCount(GetCount() + n); }

 

 

    class TBase { class TDerived: public TBase { private: private: int count; public: int secondCount TBase() {count = 0;} public void SetCount (int n) {count = n;} TDerived() int GetCount(void) {return count;} }; void ChangCount(int n) {SetCount(GetCount() + n); } };    

           
 
 
   
     
 

 


Рис. 3.5. взаимосвязь классов

Защищенные члены класса

Защищенный член класса нечто среднее между закрытым и открытым членом. (protected)

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

Рис. 3.6. иллюстрирует родственные взаимосвязи между производными и базовыми классами и их закрытыми, защищенными и открытыми членами.

 

 
 


    Унаследованные члены   Унаследованные члены  
Производный класс
Базовый класс
    Закрытые члены   Защищенные члены   Открытые члены

 
 

 

 


Рис. 3.6. закрытые защищенные и

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


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


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



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




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