Студопедия

КАТЕГОРИИ:


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

Введение в наследование

Конструкторы с параметрами

Конструктору можно передавать аргументы. Для этого просто добавьте необходимые параметры в объявление и определение конструктора. Затем при объявлении объекта задайте параметры в качестве аргументов. Чтобы понять, как это делается, начнем с короткого примера:

#include <iostream>

using namespace std;

 

class myclass

{

private:

int a;

public:

myclass(int x); // конструктор

void show();

};

 

myclass::myclass (int x)

{

cout << "В конструкторе\n";

a=x;

}

 

void myclass::show()

{

cout «a «"\n";

}

int main()

{

myclass ob (4);

ob.show();

return 0;

}

Здесь конструктор класса myclass имеет один параметр. Значение, передаваемое в myclass(), используется для инициализации переменной а. Обратите особое внимание на то, как в функции main() объявляется объект ob. Число 4, записанное в круглых скобках, является аргументом, передаваемым параметру х конструктора myclass(), который используется для инициализации переменной а.

 

В отличие от конструктора деструктор не может иметь параметров. Смысл этого понять достаточно просто: отсутствует механизм передачи аргументов удаленному объекту.

 

Вполне допустимо передавать конструктору несколько аргументов. В этом примере конструктору myclass() передается два аргумента:

#include <iostream>

using namespace std;

 

class myclass

{

private:

int a, b;

public:

myclass(int x, int у) // конструктор

{

a=x;

b=y;

}

void show() { cout << a << ‘ ‘ << b << endl;}

};

int main()

{

myclass ob(4,7);

ob.show();

return 0;

}

Здесь 4 передается в х, а 7 передается в у. Такой же общий подход используется для передачи любого необходимого числа аргументов.

Применительно к С++ наследование — это механизм, посредством которого один класс может наследовать свойства другого. Наследование позволяет строить иерархию классов, переходя от более общих к более специальным.

Для начала необходимо определить два термина, обычно используемые при обсуждении наследования. Когда один класс наследуется другим, класс, который наследуется, называют базовым классом (base class). Наследующий класс называют производным классом (derived class). Обычно процесс наследования начинается с задания базового класса. Базовый класс определяет все те качества, которые будут общими для всех производных от него классов. В сущности, базовый класс представляет собой наиболее общее описание ряда характерных черт. Производный класс наследует эти общие черты и добавляет свойства, характерные только для него.

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

Для начала — объявление базового класса:

// Определение базового класса

class В

{

private:

int i;

public:

void set_i(int n);

int get_i();

};

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

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

class D: public В

{

private:

int j;

public:

void set_j(int n);

int mul ();

};

Внимательно посмотрите на это объявление. Обратите внимание, что после имени класса D имеется двоеточие, за которым следует ключевое слово public и имя класса В. Для компилятора это указание на то, что класс D будет наследовать все компоненты класса В. Само ключевое слово public информирует компилятор о том, что, поскольку класс В будет наследоваться, значит, все открытые элементы базового класса будут также открытыми элементами производного класса. Однако все закрытые элементы базового класса останутся закрытыми и к ним не будет прямого доступа из производного класса.

Ниже приводится законченная программа, в которой используются классы В и D:

// Простой пример наследования

#include <conio>

#include <iostream>

using namespace std;

// Определение базового класса

class B

{

private:

int i;

public:

void set_i(int n);

int get_i();

};

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

class D: public B

{

private:

int j;

public:

void set_j(int n);

int mul ();

};

// Задание значения i в базовом классе

void B::set_i(int n)

{

i = n;

}

// Возвращение значения i в базовом классе

int B::get_i()

{

return i;

}

 

//Задание значения j в производном классе

void D::set_j(int n)

{

j = n;

}

 

//Возвращение значения i базового класса и j - производного

int D::mul()

{

// производный класс может

// вызывать функции-члены базового класса

return j * get_i ();

}

 

int main()

{

D ob;

ob.set_i(10); // загрузка i в базовый класс

ob. set_j (4); // загрузка j в производный класс

cout << ob.mul(); // вывод числа 40

getch();

return 0;

}

Обратите внимание на определение функции mul(). Отметьте, что функция get__i(), которая является членом базового класса В, а не производного D, вызывается внутри класса D без всякой связи с каким бы то ни было объектом. Это возможно потому, что открытые члены класса В становятся открытыми членами класса D. В функции mul() вместо прямого доступа к i, необходимо вызывать функцию get_i(), поскольку закрытые члены базового класса (в данном случае i) остаются закрытыми для нее и недоступными из любого производного класса. Причина, по которой закрытые члены класса становятся недоступными для производных классов — поддержка инкапсуляции. Если бы закрытые члены класса становились открытыми просто посредством наследования этого класса, инкапсуляция была бы совершенно несостоятельна.

Здесь показана основная форма наследования базового класса:

class имя_производного__класса: с_д имя_базового_класса

{

.

.

.

};

 

Здесь сд (спецификатор доступа) — это одно из следующих трех ключевых слов: public (открытый), private (закрытый) или protected (защищенный).

В данном случае для наследования класса используется именно public. Полное описание этих спецификаторов доступа будет дано позже.

 

<== предыдущая лекция | следующая лекция ==>
Конструкторы и деструкторы | Лекция 9 . Право международной безопасности
Поделиться с друзьями:


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


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



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




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