Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Магистратура Языки программирования С,C++ / Доклад на тему №8 Наследование, перегрузка, переопределение.docx
Скачиваний:
3
Добавлен:
17.03.2024
Размер:
1.31 Mб
Скачать

4.1 Правила перегрузки

  1. Если есть точное совпадение, то используется оно

  2. Если нет функции, которая могла бы подойти с учетом преобразований, выдается ошибка

3. Есть функции, подходящие с учётом преобразований:

3.1 Расширение типов

Под расширением типа понимается одно из следующих преобразований:

  • фактический аргумент типа char, unsigned char или short расширяется до типа int. Фактический аргумент типа unsigned short расширяется до типа int, если машинный размер int больше, чем размер short, и до типа unsigned int в противном случае;

  • аргумент типа float расширяется до типа double;

  • аргумент перечислимого типа расширяется до первого из следующих типов, который способен представить все значения элементов перечисления: int, unsigned int, long, unsigned long;

  • аргумент типа bool расширяется до типа int.

3.2 Стандартные преобразования (числа, указатели).

В языке C++ определены преобразования между его основными типами. Также определяются преобразования для указателей, ссылочных типов и типов указателей на члены. Эти преобразования называются стандартными преобразованиями.

3.3 Пользовательские преобразования.

Пользовательские преобразования выполняют преобразование между пользовательскими типами или между пользовательскими и встроенными типами. Их можно реализовать как конструкторы преобразования или как функции преобразования.

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

NB: перегрузка выполняется на этапе компиляции.

5 Переопределение методов в C ++

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

5.1 Требования для переопределения функции

- Наследование должно быть. Переопределение функций не может быть выполнено внутри класса. Для этого нам требуются производный класс и базовый класс.

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

Пример переопределения функций в C ++

Листинг № 5.1.1 – Программный код

class Base

{

public:

void show()

{

cout << "Base class";

}

};

class Derived :public Base

{

public:

void show()

{

cout << "Derived Class";

}

}

В этом примере функция show()переопределяется в производном классе. Теперь давайте изучим, как эти переопределенные функции вызываются в main()функции.

5.2 Привязка вызова функции к объектам класса

Подключение вызова функции к телу функции называется привязкой. Когда это делается до запуска программы, это называется ранним связыванием или статическим связыванием, или связыванием во время компиляции.

Листинг № 5.2.1 – Программный код

class Base

{

public:

void show()

{

cout << "Base class\n";

}

};

class Derived :public Base

{

public:

void show()

{

cout << "Derived Class\n";

}

}

int main()

{

Base b; //Base class object

Derived d; //Derived class object

b.show(); //Early Binding Ocuurs

d.show();

}

В приведенном выше примере мы вызываем переопределенную функцию, используя базовый класс и объект производного класса. Объект базового класса вызовет базовую версию функции, а объект производного класса вызовет производную версию функции.