HTML Diff
2 added 2 removed
Original 2026-01-01
Modified 2026-03-10
1 <ul><li><a>Основная терминология</a></li>
1 <ul><li><a>Основная терминология</a></li>
2 <li><a>О классах C++</a></li>
2 <li><a>О классах C++</a></li>
3 <li><a>Наследование Си Плюс-Плюс</a><ul><li><a>Класс "Человек"</a></li>
3 <li><a>Наследование Си Плюс-Плюс</a><ul><li><a>Класс "Человек"</a></li>
4 <li><a>Public Class "Игроки в баскетбол"</a></li>
4 <li><a>Public Class "Игроки в баскетбол"</a></li>
5 <li><a>Сделать "Баскетбольных игроков" дочерним</a></li>
5 <li><a>Сделать "Баскетбольных игроков" дочерним</a></li>
6 <li><a>Public элемент Employer</a></li>
6 <li><a>Public элемент Employer</a></li>
7 <li><a>Цепочки</a></li>
7 <li><a>Цепочки</a></li>
8 </ul></li>
8 </ul></li>
9 <li><a>"Заимствование" и C#</a><ul><li><a>Пример "Животные" и конструкторы</a></li>
9 <li><a>"Заимствование" и C#</a><ul><li><a>Пример "Животные" и конструкторы</a></li>
10 </ul></li>
10 </ul></li>
11 <li><a>Множественное наследование в C</a><ul><li><a>В С++</a><ul><li><a>Возможные неурядицы</a></li>
11 <li><a>Множественное наследование в C</a><ul><li><a>В С++</a><ul><li><a>Возможные неурядицы</a></li>
12 </ul></li>
12 </ul></li>
13 <li><a>В C#</a><ul><li><a>Об интерфейсах</a></li>
13 <li><a>В C#</a><ul><li><a>Об интерфейсах</a></li>
14 <li><a>О непосредственном "перенятии"</a></li>
14 <li><a>О непосредственном "перенятии"</a></li>
15 </ul></li>
15 </ul></li>
16 </ul></li>
16 </ul></li>
17 </ul><p>Каждый уважающий себя программист должен уметь работать с языками программирования, которые относятся к Си-семейству. Это - современный подход при написании разнообразного контента. В основном упор делается на C++. Профессиональные разработчики способны применять данную "лексику" как для элементарных, так и для крупных запутанных задач.</p>
17 </ul><p>Каждый уважающий себя программист должен уметь работать с языками программирования, которые относятся к Си-семейству. Это - современный подход при написании разнообразного контента. В основном упор делается на C++. Профессиональные разработчики способны применять данную "лексику" как для элементарных, так и для крупных запутанных задач.</p>
18 <p>Каждый язык имеет собственные нюансы, алгоритмы, объекты и функции. Немаловажным моментом является так называемое наследование. Зная, что это такое, можно с легкостью составить довольно сложный программный код с минимальными усилиями. В статье будут рассмотрены принципы наследования в C++ и C#.</p>
18 <p>Каждый язык имеет собственные нюансы, алгоритмы, объекты и функции. Немаловажным моментом является так называемое наследование. Зная, что это такое, можно с легкостью составить довольно сложный программный код с минимальными усилиями. В статье будут рассмотрены принципы наследования в C++ и C#.</p>
19 <h2>Основная терминология</h2>
19 <h2>Основная терминология</h2>
20 <p>Для того, чтобы хорошо разбираться в дальнейшей информации, пользователю предстоит изучить некоторые термины:</p>
20 <p>Для того, чтобы хорошо разбираться в дальнейшей информации, пользователю предстоит изучить некоторые термины:</p>
21 <ol><li>Базовый класс - некий класс, который выступает "базисом" при наследовании производным классом.</li>
21 <ol><li>Базовый класс - некий класс, который выступает "базисом" при наследовании производным классом.</li>
22 <li>Деструкторы - методы класса, необходимые для деинициализации объекта.</li>
22 <li>Деструкторы - методы класса, необходимые для деинициализации объекта.</li>
23 <li>Идентификатор - уникальное имя, присваиваемое функциям, переменным, иным объектам программирования.</li>
23 <li>Идентификатор - уникальное имя, присваиваемое функциям, переменным, иным объектам программирования.</li>
24 <li>Инкапсуляция - механизмы, связывающие коды (операции) с информацией, коими происходит манипуляция. Осуществляется дополнительная защита от внешнего вмешательства и неправильного задействования.</li>
24 <li>Инкапсуляция - механизмы, связывающие коды (операции) с информацией, коими происходит манипуляция. Осуществляется дополнительная защита от внешнего вмешательства и неправильного задействования.</li>
25 <li>Класс - шаблоны, определяющие тот или иной объект в программе, его форму.</li>
25 <li>Класс - шаблоны, определяющие тот или иной объект в программе, его форму.</li>
26 <li>Конструкторы - методы классов. Используются для инициализации элементов.</li>
26 <li>Конструкторы - методы классов. Используются для инициализации элементов.</li>
27 <li>Массивы - коллекции переменных одного и того же вида. К ним обращение происходит при помощи общих имен.</li>
27 <li>Массивы - коллекции переменных одного и того же вида. К ним обращение происходит при помощи общих имен.</li>
28 <li>Переменная - основная единица при составлении машинного кода. Элемент памяти, которому присвоили имя и значение.</li>
28 <li>Переменная - основная единица при составлении машинного кода. Элемент памяти, которому присвоили имя и значение.</li>
29 <li>Полиморфизм - свойство классов решать похожие задачи разными способами. Одно имя используется сразу для нескольких методов, обладающих похожими друг на друга назначениями.</li>
29 <li>Полиморфизм - свойство классов решать похожие задачи разными способами. Одно имя используется сразу для нескольких методов, обладающих похожими друг на друга назначениями.</li>
30 <li>Производный класс - своеобразный класс, наследующий от базового.</li>
30 <li>Производный класс - своеобразный класс, наследующий от базового.</li>
31 <li>Рекурсия - операция, при которой функция вызывает сама себя.</li>
31 <li>Рекурсия - операция, при которой функция вызывает сама себя.</li>
32 <li>Строка (String name) - последовательность символов (с именем), заключенная в двойные кавычки.</li>
32 <li>Строка (String name) - последовательность символов (с именем), заключенная в двойные кавычки.</li>
33 <li>Структура - образец, определяющий форму объекта. От класса отличается тем, что все его составляющие являются открытыми изначально.</li>
33 <li>Структура - образец, определяющий форму объекта. От класса отличается тем, что все его составляющие являются открытыми изначально.</li>
34 <li>Указатели - маркеры/объекты, хранящие в себе адреса памяти.</li>
34 <li>Указатели - маркеры/объекты, хранящие в себе адреса памяти.</li>
35 <li>Функции - подпрограмма или операция, которая используется при решении тех или иных задач.</li>
35 <li>Функции - подпрограмма или операция, которая используется при решении тех или иных задач.</li>
36 - </ol><p>Все это обязательно поможет каждому программисту. Предложенная терминология используется не только в Си-семействе, но и в остальных programming languages.</p>
36 + </ol><p>Все это обязательно поможет каждому программисту. Предложенна терминология используется не только в Си-семействе, но и в остальных programming languages.</p>
37 <h2>О классах C++</h2>
37 <h2>О классах C++</h2>
38 <p>Программист, который может написать утилиту на C++ - это настоящий профессионал. Но для того, чтобы справиться с поставленной задачей, приходится изучать разнообразные особенности "лексики".</p>
38 <p>Программист, который может написать утилиту на C++ - это настоящий профессионал. Но для того, чтобы справиться с поставленной задачей, приходится изучать разнообразные особенности "лексики".</p>
39 <p>Немаловажный раздел - это классы и объекты. Они тесно связаны с так называемым наследованием, на котором будет заострено внимание далее.</p>
39 <p>Немаловажный раздел - это классы и объекты. Они тесно связаны с так называемым наследованием, на котором будет заострено внимание далее.</p>
40 <p>Классом принято в C++ называть абстракции, которые описывают методы и свойства элементов, которых не существует. Объекты здесь - это конкретизированное представление абстракций со своими методами и свойствами.</p>
40 <p>Классом принято в C++ называть абстракции, которые описывают методы и свойства элементов, которых не существует. Объекты здесь - это конкретизированное представление абстракций со своими методами и свойствами.</p>
41 <p>Экземпляры класса - составляющие утилиты, которые появились, опираясь на один класс. У них может быть совершенно разное поведение и свойства. Построить оные удается несколькими способами. А именно:</p>
41 <p>Экземпляры класса - составляющие утилиты, которые появились, опираясь на один класс. У них может быть совершенно разное поведение и свойства. Построить оные удается несколькими способами. А именно:</p>
42 <ol><li>Инкапсуляцией. С ее помощью происходит объединение в классах данных и методов. Детализация скрывается от юзера.</li>
42 <ol><li>Инкапсуляцией. С ее помощью происходит объединение в классах данных и методов. Детализация скрывается от юзера.</li>
43 <li>Полиморфизмом. Свойство, посредством которого объекты классов с одними и теми же интерфейсами без сведений о типе и внутренней структуре могут задействоваться при необходимости.</li>
43 <li>Полиморфизмом. Свойство, посредством которого объекты классов с одними и теми же интерфейсами без сведений о типе и внутренней структуре могут задействоваться при необходимости.</li>
44 <li>Наследованием. Процесс, который позволяет создавать классы-потомки. За основу берется уже существующий вариант, а характеристики "родителя" присваиваются "следующему поколению".</li>
44 <li>Наследованием. Процесс, который позволяет создавать классы-потомки. За основу берется уже существующий вариант, а характеристики "родителя" присваиваются "следующему поколению".</li>
45 </ol><p>Для того, чтобы класс объявить, требуется задействовать ключевое слово Class. У рассматриваемого элемента есть спецификаторы доступа:</p>
45 </ol><p>Для того, чтобы класс объявить, требуется задействовать ключевое слово Class. У рассматриваемого элемента есть спецификаторы доступа:</p>
46 <ol><li>Private - методы и свойства, которые объявлены внутри class, будут доступны только в пределах оного.</li>
46 <ol><li>Private - методы и свойства, которые объявлены внутри class, будут доступны только в пределах оного.</li>
47 <li>Public - доступ предоставляется иным составляющим и функциям приложения.</li>
47 <li>Public - доступ предоставляется иным составляющим и функциям приложения.</li>
48 <li>Protected - предоставляет доступ к членам класса, а также к дружественным и дочерним "составляющим". За пределами тела class доступ закрывается.</li>
48 <li>Protected - предоставляет доступ к членам класса, а также к дружественным и дочерним "составляющим". За пределами тела class доступ закрывается.</li>
49 </ol><p>Это базис, который пригодится каждому для углубленного изучения наследования.</p>
49 </ol><p>Это базис, который пригодится каждому для углубленного изучения наследования.</p>
50 <h2>Наследование Си Плюс-Плюс</h2>
50 <h2>Наследование Си Плюс-Плюс</h2>
51 <p>В Си Плюс-Плюс наследование производится между классами. Тип отношений - "является". Class, от которого осуществляется рассматриваемая "операция", называется базовым (суперклассом или родительским). Тот элемент, который "забирает" свойства и характеристики - дочерним (подклассом или производным).</p>
51 <p>В Си Плюс-Плюс наследование производится между классами. Тип отношений - "является". Class, от которого осуществляется рассматриваемая "операция", называется базовым (суперклассом или родительским). Тот элемент, который "забирает" свойства и характеристики - дочерним (подклассом или производным).</p>
52 <p>Последний наследует методы и свойства (переменные). Дополнительно учитываются определенные ограничения доступа. Дочерние "составляющие" полноценны, могут обладать собственными членами. Далее будут рассматриваться примеры, помогающие разобраться в конструкторах базового класса, а также в наследовании в полной мере.</p>
52 <p>Последний наследует методы и свойства (переменные). Дополнительно учитываются определенные ограничения доступа. Дочерние "составляющие" полноценны, могут обладать собственными членами. Далее будут рассматриваться примеры, помогающие разобраться в конструкторах базового класса, а также в наследовании в полной мере.</p>
53 <h3>Класс "Человек"</h3>
53 <h3>Класс "Человек"</h3>
54 <p>Вот код, который поможет представить в приложении человека:</p>
54 <p>Вот код, который поможет представить в приложении человека:</p>
55 class Human { public: std::string m_name; int m_age; Human(std::string name = "", int age = 0) : m_name(name), m_age(age) { } std::string getName() const { return m_name; } int getAge() const { return m_age; } };<p>Здесь определяются только элементы, которые служат общими для всех объектов. Все люди, независимо от половой принадлежности, профессии, возраста и других "параметров", имеют возраст и имя.</p>
55 class Human { public: std::string m_name; int m_age; Human(std::string name = "", int age = 0) : m_name(name), m_age(age) { } std::string getName() const { return m_name; } int getAge() const { return m_age; } };<p>Здесь определяются только элементы, которые служат общими для всех объектов. Все люди, независимо от половой принадлежности, профессии, возраста и других "параметров", имеют возраст и имя.</p>
56 <p>Пример предусматривает спецификатор public. Отсюда следует, что имеющиеся переменные и методы открытые. Но можно сделать их "приватными", как это обычно бывает. Данный прием позволяет контролировать доступ и следить за наследованием.</p>
56 <p>Пример предусматривает спецификатор public. Отсюда следует, что имеющиеся переменные и методы открытые. Но можно сделать их "приватными", как это обычно бывает. Данный прием позволяет контролировать доступ и следить за наследованием.</p>
57 <p>Внимание: программерам в процессе работы с рассматриваемым действием может потребоваться работа с include iostream. Это - элемент стандартной библиотеки в Си Плюс-Плюс, который представлен заголовочным файлом с классами, переменными и функциями.</p>
57 <p>Внимание: программерам в процессе работы с рассматриваемым действием может потребоваться работа с include iostream. Это - элемент стандартной библиотеки в Си Плюс-Плюс, который представлен заголовочным файлом с классами, переменными и функциями.</p>
58 <h3>Public Class "Игроки в баскетбол"</h3>
58 <h3>Public Class "Игроки в баскетбол"</h3>
59 <p>На основании предложенного выше кода будем работать с наследованием в Си Плюс-Плюс. Требуется написать утилиту, отслеживающую сведения о тех, кто играет в баскетбол. Сохраняется средний уровень игры, а также то, сколько очков набрал конкретный человек:</p>
59 <p>На основании предложенного выше кода будем работать с наследованием в Си Плюс-Плюс. Требуется написать утилиту, отслеживающую сведения о тех, кто играет в баскетбол. Сохраняется средний уровень игры, а также то, сколько очков набрал конкретный человек:</p>
60 <p>Это - незавершенный public class. Дополнительно необходимо знать имя и возраст игрока. Для этого используется первый представленный код. Вывести запрашиваемую информацию предлагается несколькими способами:</p>
60 <p>Это - незавершенный public class. Дополнительно необходимо знать имя и возраст игрока. Для этого используется первый представленный код. Вывести запрашиваемую информацию предлагается несколькими способами:</p>
61 <ol><li>Добавить в "Баскетбольные игроки" новые члены с соответствующими материалами. Не самый лучший выход, так как он приводит к дублированию кода.</li>
61 <ol><li>Добавить в "Баскетбольные игроки" новые члены с соответствующими материалами. Не самый лучший выход, так как он приводит к дублированию кода.</li>
62 <li>При помощи так называемой композиции добавить public Human в виде члена класса BasketballPlayer. Но это некорректное решение.</li>
62 <li>При помощи так называемой композиции добавить public Human в виде члена класса BasketballPlayer. Но это некорректное решение.</li>
63 <li>Произвести настройку кода так, чтобы новый "элемент кода" наследовал те или иные атрибуты от первого. Это и есть тип отношений "является".</li>
63 <li>Произвести настройку кода так, чтобы новый "элемент кода" наследовал те или иные атрибуты от первого. Это и есть тип отношений "является".</li>
64 </ol><p>После изучения возможных вариантов развития событий стоит отдать предпочтение последнему.</p>
64 </ol><p>После изучения возможных вариантов развития событий стоит отдать предпочтение последнему.</p>
65 <h3>Сделать "Баскетбольных игроков" дочерним</h3>
65 <h3>Сделать "Баскетбольных игроков" дочерним</h3>
66 <p>Для реализации поставленной задачи требуется после public class BasketballPlayer воспользоваться двоеточием. Здесь без ключевого слова public не обойтись, как и без имени классового элемента. Это - открытая операция:</p>
66 <p>Для реализации поставленной задачи требуется после public class BasketballPlayer воспользоваться двоеточием. Здесь без ключевого слова public не обойтись, как и без имени классового элемента. Это - открытая операция:</p>
67 <p>Также программисты часто думают, что такое так называемое множественное наследование. Этот вопрос будет рассмотрен позже.</p>
67 <p>Также программисты часто думают, что такое так называемое множественное наследование. Этот вопрос будет рассмотрен позже.</p>
68 <p>Вследствие проделанных манипуляций происходит "заимствование" информации от родительских классов. У "Игроков в баскетбол" имеются и собственные члены - m_points и m_gameAverage. В них есть необходимость, так как на экран выводятся не только сведения об именах и возрасте.</p>
68 <p>Вследствие проделанных манипуляций происходит "заимствование" информации от родительских классов. У "Игроков в баскетбол" имеются и собственные члены - m_points и m_gameAverage. В них есть необходимость, так как на экран выводятся не только сведения об именах и возрасте.</p>
69 <p>Полный код утилиты будет выглядеть так:</p>
69 <p>Полный код утилиты будет выглядеть так:</p>
70 <p>В итоге на экране появится надпись "Антон" (на английском).</p>
70 <p>В итоге на экране появится надпись "Антон" (на английском).</p>
71 <h3>Public элемент Employer</h3>
71 <h3>Public элемент Employer</h3>
72 <p>Пусть будет еще один "потомок" от Human. За основу возьмем информацию о работниках. Подчиненный - это человек. Соответственно, изучаемый процесс здесь уместен:</p>
72 <p>Пусть будет еще один "потомок" от Human. За основу возьмем информацию о работниках. Подчиненный - это человек. Соответственно, изучаемый процесс здесь уместен:</p>
73 <p>Сразу прописывать public в самом начале кодификации не нужно. Это нарушает структуру кода. "Сотрудник" забирает от "Человека" два метода - имя и возраст, а также обладает собственными переменными и одним методом. PrintNameAndWage() задействует переменные как из родительского "источника", так и из собственного.</p>
73 <p>Сразу прописывать public в самом начале кодификации не нужно. Это нарушает структуру кода. "Сотрудник" забирает от "Человека" два метода - имя и возраст, а также обладает собственными переменными и одним методом. PrintNameAndWage() задействует переменные как из родительского "источника", так и из собственного.</p>
74 <p>Внимание: BasketballPlayer и Employer не связаны, но написаны в пределах одной и той же программы. Кодификация имеет следующий вид:</p>
74 <p>Внимание: BasketballPlayer и Employer не связаны, но написаны в пределах одной и той же программы. Кодификация имеет следующий вид:</p>
75 <p>В итоге на экране появится надпись "Иван: 350".</p>
75 <p>В итоге на экране появится надпись "Иван: 350".</p>
76 <h3>Цепочки</h3>
76 <h3>Цепочки</h3>
77 <p>Представляется возможным проводить передачу информации "потомкам" от классовых элементов, которые изначально тоже брали от "кого-то" данные. Можно для примера составить отдельный "блок" под названием Супервайзер:</p>
77 <p>Представляется возможным проводить передачу информации "потомкам" от классовых элементов, которые изначально тоже брали от "кого-то" данные. Можно для примера составить отдельный "блок" под названием Супервайзер:</p>
78 <p>Информация берется из public Employer, который когда-то получал сведения из Human.</p>
78 <p>Информация берется из public Employer, который когда-то получал сведения из Human.</p>
79 <h2>"Заимствование" и C#</h2>
79 <h2>"Заимствование" и C#</h2>
80 <p>Перед тем, как задумываться, что такое так называемое множественное наследование в Си-семействе, требуется разобраться с "обычным". Теперь рассмотрим несколько примеров C#.</p>
80 <p>Перед тем, как задумываться, что такое так называемое множественное наследование в Си-семействе, требуется разобраться с "обычным". Теперь рассмотрим несколько примеров C#.</p>
81 <p>Принципы использования здесь будут примерно такими же, как и в уже рассмотренном варианте. Для создания "дочерних" элементов не требуется никаких особых навыков и знаний. Для того, чтобы было проще работать с кодом, будем использовать тип public. Это поможет избежать появления дополнительных окон и сообщений об ошибке при получении доступа к запрашиваемым сведениям.</p>
81 <p>Принципы использования здесь будут примерно такими же, как и в уже рассмотренном варианте. Для создания "дочерних" элементов не требуется никаких особых навыков и знаний. Для того, чтобы было проще работать с кодом, будем использовать тип public. Это поможет избежать появления дополнительных окон и сообщений об ошибке при получении доступа к запрашиваемым сведениям.</p>
82 <p>Важно учитывать, что:</p>
82 <p>Важно учитывать, что:</p>
83 <ol><li>C# предусматривает одиночное "заимствование". От двух и более public (или иных) классовых составляющих процесс производиться не может.</li>
83 <ol><li>C# предусматривает одиночное "заимствование". От двух и более public (или иных) классовых составляющих процесс производиться не может.</li>
84 <li>Отношение наследования - некоторое отношение, демонстрирующее переход от общей абстракции к конкретной.</li>
84 <li>Отношение наследования - некоторое отношение, демонстрирующее переход от общей абстракции к конкретной.</li>
85 <li>Абстрактный классовых "объект" - классовая составляющая, объекты которого нельзя создавать. Ключевое слово new здесь не используется. Элемент задействуется в качестве прародителя.</li>
85 <li>Абстрактный классовых "объект" - классовая составляющая, объекты которого нельзя создавать. Ключевое слово new здесь не используется. Элемент задействуется в качестве прародителя.</li>
86 <li>Sealed - слово, которое позволяет устанавливать запрет на наследников. Пример - string. Права "заимствования" здесь не имеют места.</li>
86 <li>Sealed - слово, которое позволяет устанавливать запрет на наследников. Пример - string. Права "заимствования" здесь не имеют места.</li>
87 <li>Virtual - превращает метод в виртуальный, чтобы использовать предопределение наследников.</li>
87 <li>Virtual - превращает метод в виртуальный, чтобы использовать предопределение наследников.</li>
88 </ol><p>Все это поможет в дальнейших примерах. Пока рано задумываться, что такое часто применяемое множественное наследование, потому как не все разбираются в обычном. Ниже будет наглядный пример "манипуляции" в C#.</p>
88 </ol><p>Все это поможет в дальнейших примерах. Пока рано задумываться, что такое часто применяемое множественное наследование, потому как не все разбираются в обычном. Ниже будет наглядный пример "манипуляции" в C#.</p>
89 <h3>Пример "Животные" и конструкторы</h3>
89 <h3>Пример "Животные" и конструкторы</h3>
90 <p>Пусть будет классовый элемент Animal. В нем будут создаваться поля и методы, характерные для всей "живности":</p>
90 <p>Пусть будет классовый элемент Animal. В нем будут создаваться поля и методы, характерные для всей "живности":</p>
91 <ul><li>вес;</li>
91 <ul><li>вес;</li>
92 <li>сколько живет (в среднем);</li>
92 <li>сколько живет (в среднем);</li>
93 <li>наличие хвоста;</li>
93 <li>наличие хвоста;</li>
94 <li>что ест.</li>
94 <li>что ест.</li>
95 </ul><p>От него сделаем дочернюю классовую составляющую (тоже public) - "Собака". Исходный код:</p>
95 </ul><p>От него сделаем дочернюю классовую составляющую (тоже public) - "Собака". Исходный код:</p>
96 <p>Стоит обратить внимание на то, что "заимствованию" в Шарпе не подлежат так называемые конструкторы. Если они есть у родителей, то у наследников доступа к оным не будет. Несмотря на это, вызов будет осуществляться автоматически. Это - дефолтный конструктор. Чтобы его вызвать, рекомендуется использовать ключевик base.</p>
96 <p>Стоит обратить внимание на то, что "заимствованию" в Шарпе не подлежат так называемые конструкторы. Если они есть у родителей, то у наследников доступа к оным не будет. Несмотря на это, вызов будет осуществляться автоматически. Это - дефолтный конструктор. Чтобы его вызвать, рекомендуется использовать ключевик base.</p>
97 <p>Пусть будет некая классовая составляющая Degree, в котором выставлены градусы, а также метод, возвращающий его значение. Дочерним создадим Radiance. Он будет переводить информацию в радианы:</p>
97 <p>Пусть будет некая классовая составляющая Degree, в котором выставлены градусы, а также метод, возвращающий его значение. Дочерним создадим Radiance. Он будет переводить информацию в радианы:</p>
98 <p>Внимание: запись public virtual делает информацию виртуальной.</p>
98 <p>Внимание: запись public virtual делает информацию виртуальной.</p>
99 <h2>Множественное наследование в C</h2>
99 <h2>Множественное наследование в C</h2>
100 <p>До сих пор рассматривалось лишь "заимствование", которое предусматривало одиночный вариант. Дочерний классовый элемент в таком случае предусматривает только одного родителя (для удобства используется тип public). Но Си-семейство предусматривает и множественный "подход".</p>
100 <p>До сих пор рассматривалось лишь "заимствование", которое предусматривало одиночный вариант. Дочерний классовый элемент в таком случае предусматривает только одного родителя (для удобства используется тип public). Но Си-семейство предусматривает и множественный "подход".</p>
101 <h3>В С++</h3>
101 <h3>В С++</h3>
102 <p>Множественный "метод" - это когда у дочернего классового "объекта" будет несколько предков. Пример - отслеживание работы преподавателей. Работать будем с предыдущими элементами кода. Учитель - это человек, но также он будет подчиненным.</p>
102 <p>Множественный "метод" - это когда у дочернего классового "объекта" будет несколько предков. Пример - отслеживание работы преподавателей. Работать будем с предыдущими элементами кода. Учитель - это человек, но также он будет подчиненным.</p>
103 <p>Задумываясь, что такое в Си-семействе множественное наследование, стоит обращать внимание на логические связи. Без них освоить рассматриваемое направление невозможно. Поэтому создадим новый классовый "объект" под названием "Учитель".</p>
103 <p>Задумываясь, что такое в Си-семействе множественное наследование, стоит обращать внимание на логические связи. Без них освоить рассматриваемое направление невозможно. Поэтому создадим новый классовый "объект" под названием "Учитель".</p>
104 <p>Чтобы реализовать подход, потребуется:</p>
104 <p>Чтобы реализовать подход, потребуется:</p>
105 <ul><li>присвоить переменным (int main или другим) для удобства "тип" public;</li>
105 <ul><li>присвоить переменным (int main или другим) для удобства "тип" public;</li>
106 <li>прописать "стандартную" запись "заимствования";</li>
106 <li>прописать "стандартную" запись "заимствования";</li>
107 <li>через запятую указать тип "заимствования", а также второго родителя.</li>
107 <li>через запятую указать тип "заимствования", а также второго родителя.</li>
108 </ul><p>В конечном итоге получится такой код:</p>
108 </ul><p>В конечном итоге получится такой код:</p>
109 <p>В предложенном примере используется "заимствование" типа public.</p>
109 <p>В предложенном примере используется "заимствование" типа public.</p>
110 <h4>Возможные неурядицы</h4>
110 <h4>Возможные неурядицы</h4>
111 - <p>Несмотря на т, что рассмотренный прием - это довольно быстрое и простое расширение "базисного", его применение на практике способно привести в определенным ошибкам. Сложность утилит увеличивается. Поддержка кода способна стать настоящей проблемой.</p>
111 + <p>Несмотря на то, что рассмотренный прием - это довольно быстрое и простое расширение "базисного", его применение на практике способно привести в определенным ошибкам. Сложность утилит увеличивается. Поддержка кода способна стать настоящей проблемой.</p>
112 <p>Рассмотрим несколько наиболее распространенных ситуаций:</p>
112 <p>Рассмотрим несколько наиболее распространенных ситуаций:</p>
113 <p>1.Возникновение неоднозначности. Такие ситуации возникают, когда у нескольких родителей имеются методы с одинаковыми именами. Здесь при компилировании "c54G…" просматривает наличие метода getID() у "Wireless…", который отсутствует. В итоге компилятор продвинется вверх по цепи, отыщет у родительских классовых элементов соответствующий "объект". Он обнаружен у USB и Network. В результате появится сообщение об ошибке, так как компилятор не поймет, какой именно ID использовать.</p>
113 <p>1.Возникновение неоднозначности. Такие ситуации возникают, когда у нескольких родителей имеются методы с одинаковыми именами. Здесь при компилировании "c54G…" просматривает наличие метода getID() у "Wireless…", который отсутствует. В итоге компилятор продвинется вверх по цепи, отыщет у родительских классовых элементов соответствующий "объект". Он обнаружен у USB и Network. В результате появится сообщение об ошибке, так как компилятор не поймет, какой именно ID использовать.</p>
114 <p>Для исправления ситуации достаточно внести уточнение:</p>
114 <p>Для исправления ситуации достаточно внести уточнение:</p>
115 <p>2."Алмаз смерти" или "Алмаз обреченности". Так называют ситуацию, при которой у классового элемента 2 родителя, каждый из которых уже наследовал свойства одного и того же "прародителя":</p>
115 <p>2."Алмаз смерти" или "Алмаз обреченности". Так называют ситуацию, при которой у классового элемента 2 родителя, каждый из которых уже наследовал свойства одного и того же "прародителя":</p>
116 <p>Во втором случае сканеры и принтеры служат устройствами. Питаются от розетки и получают свойства "Powered…". Но ксерокс объединяет эти два девайса. Поддержка такого кода способна привести не только в медленной работе утилиты, но и к непредвиденным поворотам.</p>
116 <p>Во втором случае сканеры и принтеры служат устройствами. Питаются от розетки и получают свойства "Powered…". Но ксерокс объединяет эти два девайса. Поддержка такого кода способна привести не только в медленной работе утилиты, но и к непредвиденным поворотам.</p>
117 <h3>В C#</h3>
117 <h3>В C#</h3>
118 <p>Также стоит выяснить, что такое упомянутое ранее множественное наследование, но уже в Си Шарп. Работать, как и в прошлых случаях, будем с public, несмотря на то, что обычно переменные и другие составляющие бывают private.</p>
118 <p>Также стоит выяснить, что такое упомянутое ранее множественное наследование, но уже в Си Шарп. Работать, как и в прошлых случаях, будем с public, несмотря на то, что обычно переменные и другие составляющие бывают private.</p>
119 <h4>Об интерфейсах</h4>
119 <h4>Об интерфейсах</h4>
120 <p>Но сначала обратим внимание на немаловажный момент - интерфейсы. Это инструмент реализации полиморфизма. Некий набор методов, обеспечиваемый классовыми составляющими, воплощающими в жизнь этот самый интерфейс.</p>
120 <p>Но сначала обратим внимание на немаловажный момент - интерфейсы. Это инструмент реализации полиморфизма. Некий набор методов, обеспечиваемый классовыми составляющими, воплощающими в жизнь этот самый интерфейс.</p>
121 <p>Содержит сигнатуры. Не может включать в себя:</p>
121 <p>Содержит сигнатуры. Не может включать в себя:</p>
122 <ul><li>конструкторы;</li>
122 <ul><li>конструкторы;</li>
123 <li>константы;</li>
123 <li>константы;</li>
124 <li>поля;</li>
124 <li>поля;</li>
125 <li>статистические составляющие.</li>
125 <li>статистические составляющие.</li>
126 </ul><p>Объявляется и используется по следующему примеру:</p>
126 </ul><p>Объявляется и используется по следующему примеру:</p>
127 <p>Вот ситуация, при которой класс должен реализовывать интерфейс посредством предоставления реализации всех членов последнего:</p>
127 <p>Вот ситуация, при которой класс должен реализовывать интерфейс посредством предоставления реализации всех членов последнего:</p>
128 <p>Интерфейсы необходимы для множественного "заимствования".</p>
128 <p>Интерфейсы необходимы для множественного "заимствования".</p>
129 <h4>О непосредственном "перенятии"</h4>
129 <h4>О непосредственном "перенятии"</h4>
130 <p>Множественное наследование в C - это процесс перенятия классовой составляющей сразу от двух родителей. В Шарпе данный вариант используется редко, так как ему на смену пришли интерфейсы. Здесь классовая составляющая способна реализовывать сразу несколько interfaces. Несмотря на это, "идентификатор" public в Sharp применяется, и весьма часто.</p>
130 <p>Множественное наследование в C - это процесс перенятия классовой составляющей сразу от двух родителей. В Шарпе данный вариант используется редко, так как ему на смену пришли интерфейсы. Здесь классовая составляющая способна реализовывать сразу несколько interfaces. Несмотря на это, "идентификатор" public в Sharp применяется, и весьма часто.</p>
131 <p>При реализации нескольких интерфейсов используется разделительный символ "запятая". Кодификация окажется следующей:</p>
131 <p>При реализации нескольких интерфейсов используется разделительный символ "запятая". Кодификация окажется следующей:</p>
132 <p>Тут:</p>
132 <p>Тут:</p>
133 <ol><li>Интерфейсом объявлен некий IDrawable. Это - метод рисования некоторого числа объектов.</li>
133 <ol><li>Интерфейсом объявлен некий IDrawable. Это - метод рисования некоторого числа объектов.</li>
134 <li>Может реализовывать Image.</li>
134 <li>Может реализовывать Image.</li>
135 <li>Circle и Image - разные сущности без базового class. Для устранения неполадок создается указатель на "главный" public интерфейс.</li>
135 <li>Circle и Image - разные сущности без базового class. Для устранения неполадок создается указатель на "главный" public интерфейс.</li>
136 </ol><p>Так, в Шарпе для "перенятия" множественного типа задействованы или abstract classes, или интерфейсы.</p>
136 </ol><p>Так, в Шарпе для "перенятия" множественного типа задействованы или abstract classes, или интерфейсы.</p>
137 <a></a><a></a><p>Также вам может быть интересен<a>курс "Программист C"</a>в Otus.</p>
137 <a></a><a></a><p>Также вам может быть интересен<a>курс "Программист C"</a>в Otus.</p>
138  
138