Студопедия

КАТЕГОРИИ:


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

Конструкторы, деструкторы и наследование




Наследование классов

Лекция 22

Void p_const () const

Void main ()

Void p_non_const ()

Void p_const () const

A ()

Class A

Тип_результата имя_функции (параметры) const

Class A

Void main ()

Class A

Class coord

Константные объекты и константные элементы- функции

Ранее были рассмотрены const элементы-данные. Для их инициализации в конструкторе употреблялся список инициализации. Например:

{

const int x, y;

public:

coord (int a, int b): x(a), y(b)

{

}

};

Сейчас речь пойдет не об элементах-данных, а о константных объектах и константных элементах-функциях.

Константные объекты нужны в тех случаях, когда их применяют только для чтения. Изменять их значения нельзя принципиально. И чтобы не сделать это в программе случайно, для работы с константными объектами применяют константные функции-элементы. Эти функции не могут реализовать операцию присваивания элементам-данным константных объектов новых значений. Поэтому константные объекты могут работать (вызывать, связываться) только с константными элементами-функциями. Хотя сами константные функции могут вызываться и неконстантными объектами.

Перед константным объектом пишется ключевое слово сonst. Например:

{

===========

};

{

const A w; // w -константный объект

}

Константная функция-элемент выглядит так:

{

===========

public:

{

===========

}

};

Пример.

# include <stdio.h>

{

int x, y;

public:

{

}

A (int a, int b)

{

x=a;

y=b;

}

// Сейчас будет попытка выполнить недопустимое присвоение в

// константной функции

{

x=12; // Cannot modify a const object

y=15; // Cannot modify a const object

}

// Далее эти же действия выполняет неконстантная функция

{

x=12;

y=15;

}

};

{

const A w (1,2); // w -константный объект

A q; // q -неконстантный объект

w.p_const (); // Разрешается

q.p_const (); // Разрешается

w.p_non_const (); // Warning: non-const

// function A::p_non_const () called for

// const object. Это сообщение будет независимо от того

// есть ли недопустимое присвоение в p_non_const () или нет.

}

Внимание! Константная функция не может включать операцию присвоения для элементов-данных. Нельзя присвоить х=12; у=15, как это показано в примере. Но обнаруживается, что компилятор “не замечает”, если в константной функции ввести новые значения элементов-данных для константного объекта. Так, например, в константной функции p_const () можно сделать так:

{

puts (“Введите х, в”);

scanf (“%i%i”, &x, &y);

}

Нередко несколько классов могут иметь одинаковые элементы данных. Например, class student, class teacher, class officer должны иметь такие элементы-данные, как имя, адрес, возраст. В этом случае удобно сделать т.н. базовый класс class man, у которого будут перечисленные общие для нескольких классов элементы данных, а также необходимые члены-функции. А у этого базового класса будут производные от него классы: class student, class teacher, class officer. Эти классы будут использовать элементы базового класса и, кроме этого, иметь свои собственные элементы данных и элементы-функции.

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

сlass Base

{

.

.

.

};

сlass Derived: ключ_доступа Base

{

.

.

.

};

Ключ_доступа не является обязательным и может быть private, protected или public. Если он не указан, то по умолчанию принимается private для классов и public для структур.

Ключ_доступа определяет уровень доступа к элементам базового класса. Ниже приводится таблица с вариантами доступа.

 

 

Ключ_доступа Доступ в базовом классе Доступ в производном классе
public рublic рrotected private рublic рrotected private
protected рublic рrotected private рrotected рrotected private
private рublic рrotected private рrivate рrivate рrivate

В последнем случае имеет место доступ лишь к членам-функциям базового класса (если они в области действия метки доступа рublic).

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

Пример.

 

сlass А

{

.

.

. };

сlass В

{

..

.

};

сlass С: рublic А, рublic В

 

{

.

.

};

Здесь класс С является производным от базовых для него классов А и В. Рассмотрим пример простого наследования. Базовый – class man. Производный – сlass student. Напомним, что метка доступа рrotected в базовом классе позволяет иметь доступ из производного класса к элементам базового, находящимся в области действия этой метки.

 

#include<stdio.h>

class man

{

рrotected:

char* name;//имя

char*address;//адрес

int age;//возраст

рublic:

void get_man_info()

{

name=new char[15];

address=new char[20];

puts(“Введите имя”);

fflush(stdin);

scanf(“%s”,name);

puts(“Введите адрес”);

fflush(stdin);

scanf(“%s”, address);

puts(“Введите возраст”);

scanf(“%i”, &age);

}

void put_man_info()

{

printf(“Имя человека %s.Его адрес % s. Возраст %i\n”,name,address,age);

}

}: //Закончилось описание класса man

class student:public man

{

char* group; //группа

рublic:

void get_stud_info()

{

group =new char[10];

puts(“Введите группу”);

fflush(stdin);

scanf(“%i”, group);

}

void put_stud_info()

{

printf(“Имя студента %s.Его адрес % s. возраст. Учится в группе % s \n”,name,address,age, group);// Используются элементы-данные из базового класса.

}

}

void main

{

man x;//Элемент базового класса

x.get_man_info();

x.put_man_info();

student y; //Элемент производного класса

y.get_man_info();

y.get_stud_info();

y.put_stud_info();

}

Здесь объект производного класса y вызывает функцию get_man_info(), являющуюся членом-функцией базового класса man. При вызове y.put_stud_info() будут выведены y.name, y.address, y.age и y.group.

В принципе, class student мог бы быть базовым, например, для class stud_sport (студент-спортсмен). Для этого в class student метку доступа к элементу данных group нужно сделать рrotected. Тогда объекты класса stud_sport смогут использовать элементы-данные и члены-функции как класса student, так и класса man, являющегося базовым для класса student.

 

 

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

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

 




Поделиться с друзьями:


Дата добавления: 2015-06-27; Просмотров: 573; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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