Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции

Содержание

Слайд 2

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

Объект производного класса обладает всеми методами и атрибутами базового. Помимо них, в

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

Слайд 3

Наследование. Пример.

class A{
int m_i;
float m_f;
};
class B: A{
double m_d;
};
class C:

Наследование. Пример. class A{ int m_i; float m_f; }; class B: A{
B{
long m_l;
};

Слайд 4

Множественное наследование.

class A{
int m_i;
};
class B {
double m_d;
};
class C: A, B{

Множественное наследование. class A{ int m_i; }; class B { double m_d;
float m_f;
};

Слайд 5

Модификаторы доступа.

public Поле/метод с таким модификатором доступно отовсюду (из самого класса, из его

Модификаторы доступа. public Поле/метод с таким модификатором доступно отовсюду (из самого класса,
потомков, из глобальных функций).
protected Доступно из самого класса и производных от него, но недоступно извне.
private Доступно только из самого класса.

Слайд 6

Модификаторы доступа.

При наследовании также указывается модификатор доступа. В соответствии с ним в

Модификаторы доступа. При наследовании также указывается модификатор доступа. В соответствии с ним
производном классе изменяются уровни доступа.
Для класса можно указать дружественные классы и функции (friend). Они будут иметь доступ ко всем полям класса.

Слайд 7

Модификаторы доступа. Пример.

class A{
private:
int m_priv;
protected:
int m_prot;
public:
int m_pub;
};
class

Модификаторы доступа. Пример. class A{ private: int m_priv; protected: int m_prot; public:
B: public A;
class C: protected A;
class D: private A;

m_priv доступно только из класса A;
m_prot доступно из классов A и производных от него (в B,C это поле остается protected, в D становится private);
m_pub доступно из классов A, в производных от него, а также извне. В классе B это поле остается public, в классе C становится protected, в классе D – private.

Слайд 8

Конструкторы.

Конструктор – специальный метод класса, который выполняется каждый раз, когда создается новый

Конструкторы. Конструктор – специальный метод класса, который выполняется каждый раз, когда создается
объект этого класса.
Имя конструктора совпадает с именем класса.
Возвращаемого значения конструктор не имеет.

Слайд 9

Конструкторы. Стандартный конструктор (без аргументов).

class String
{
char *str;
int length;
public:
String();
};
String::String()
{

Конструкторы. Стандартный конструктор (без аргументов). class String { char *str; int length;
str = NULL;
length = 0;
}

Теперь при создании переменных будет вызываться наш метод:
// Конструктор будет вызван // в каждой из этих строк: String str; String *sptr = new String;

Слайд 10

Конструкторы. Конструкторы с дополнительными параметрами.

class String
{
char *str;
int length;
public:

Конструкторы. Конструкторы с дополнительными параметрами. class String { char *str; int length;
String(const char* p);
};
String::String(const char* p)
{ length = strlen(p); str = new char[length + 1]; if (str == 0) { // обработка ошибок } // копирование строки strcpy(str, p);
}

Теперь при создании переменных можно инициализировать их с помощью нового конструктора:
String s2(“Строчка"); char* cp; String* ssptr = new String(cp);

Слайд 11

Конструкторы. Конструктор копирования.

class String
{
char *str;
int length;
public:
String(const String& s);
};
String::String(const

Конструкторы. Конструктор копирования. class String { char *str; int length; public: String(const
String& s)
{
length = s.length;
str = new char[length + 1];
strcpy(str, s.str);
}

// Создаем объект a // с начальным значением String a("Astring"); // Используем конструктор // копирования для создания // объекта b String b(a); // Изменяем объект b // Объект a остается // неизменным b.Append(a);

Слайд 12

Конструкторы. Конструктор копирования по умолчанию.

class String
{
char *str;
int length;
public:
String(const

Конструкторы. Конструктор копирования по умолчанию. class String { char *str; int length;
String& s);
};
String::String(const String& s)
{
length = s.length;
str = s.str;
}
void String::Append(const String& s)
{
length += s.length;
char* tmp = new char[length + 1];
if (tmp == 0) {
// обработка ошибки
}
strcpy(tmp, str);
strcat(tmp, s.str);
delete [] str;
str = tmp;
}

// Создаем объект a // с начальным значением String a("Astring"); // a.str указывает на строку “Astring” // Используем конструктор // копирования для создания // объекта b String b(a); // b.str указывает на ту же самую строку “Astring” // Изменяем объект b // Объект a остается // неизменным b.Append(a); // Эта функция уничтожила старую строчку // и создала новую в другом месте (на // которую теперь указывает b.str). // Но a.str по-прежнему указывает на уже // несуществующую старую строчку.

Слайд 13

Деструкторы.

Деструктор – специальный метод класса, который выполняется при уничтожении объекта.
Обычно в

Деструкторы. Деструктор – специальный метод класса, который выполняется при уничтожении объекта. Обычно
деструкторе  освобождаются ресурсы, использованные данным объектом.
Имя деструктора – это имя класса, перед которым добавлен знак ‘~’.

Слайд 14

Деструкторы. Пример.

// Деструктор для класса String
String::~String()
{
if (str)
delete [] str;
}
// Некоторая

Деструкторы. Пример. // Деструктор для класса String String::~String() { if (str) delete
функция
int funct(void)
{
// Вызывается конструктор для Str
String Str (“String”);
// Здесь вызывается конструктор для pStr
String *pStr = new String(“String 2”);
. . .
// Здесь вызовется деструктор для pStr
delete pStr;
// Здесь вызовется деструктор для Str
return 0;
}

Слайд 15

Виртуальные функции.

Виртуальные функции используются для того, чтобы можно было работать с объектами

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

Слайд 16

Виртуальные функции. Пример.

class Shape {
int cx, cy;
virtual void print();
};
class Circle:

Виртуальные функции. Пример. class Shape { int cx, cy; virtual void print();
Shape {
int r;
virtual void print();
};
class Rect: Shape {
int w,h;
virtual void print();
};

Пусть у нас есть массив Shape* shapes[];
Несмотря на то, что тип элементов массива – Shape*, т.е. указатель на объект типа Shape, реально по указателю может лежать любой объект.
Если мы напишем такой цикл, то вызываться будет функция print того типа, который на самом деле находится по адресу shapes[i]:
for(int i = 0; i < N; i++) {
shapes[i]->print();
}

Имя файла: Введение-в-С++-Наследование,-множественное-наследование.-Конструкторы,-деструкторы.-Виртуальные-функции.pptx
Количество просмотров: 39
Количество скачиваний: 0