
- •Содержание
- •1 Наследование
- •1.1 Типы наследования
- •1.2 Множественное наследование
- •1.3 Проблематика множественного наследования
- •1.4 Проблема ромбовидного наследования
- •1.5 Проблема ромбовидного наследования: Конструкторы и деструкторы
- •1.6 Интерфейс
- •1.7 Вывод по наследованию
- •2 Неявное приведение типов
- •4 Перегрузка
- •4.1 Правила перегрузки
- •5.1 Требования для переопределения функции
- •5.2 Привязка вызова функции к объектам класса
- •6 Виртуальные методы и таблица виртуальных методов
- •Принцип работы
- •6.1 Виртуальное наследование
- •6.2 Абстрактный класс
- •7 Виртуальные методы в конструкторе и деструкторе
- •Список использованных источников
4.1 Правила перегрузки
Если есть точное совпадение, то используется оно
Если нет функции, которая могла бы подойти с учетом преобразований, выдается ошибка
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();
}
В приведенном выше примере мы вызываем переопределенную функцию, используя базовый класс и объект производного класса. Объект базового класса вызовет базовую версию функции, а объект производного класса вызовет производную версию функции.