Последнее обновление:2026-10-12
Реализация полиморфизма C++ на языке C¶
Об авторе:¶
Личный официальный аккаунт:

1.Пример реализации на C++¶
Полиморфизм в C++: в C++ поддерживается таблица виртуальных функций, и согласно правилам совместимости при присваивании мы знаем, что указатель или ссылка родительского класса может указывать на объект дочернего класса.
Если указатель или ссылка родительского класса вызывает виртуальную функцию родительского класса, то этот указатель родительского класса ищет адрес своей функции в собственной таблице виртуальных функций; если же указатель или ссылка объекта родительского класса указывает на объект дочернего класса, и этот дочерний класс переопределил виртуальную функцию родительского класса, то указатель вызовет переопределённую виртуальную функцию дочернего класса.
Учебный пример кода: c++_examp.cpp
2.Реализация на C¶
- Инкапсуляция
В языке C нет понятия класса (class), но есть структура struct, и мы можем попробовать имитировать класс с её помощью.
Используя указатели на функции, мы инкапсулируем свойства и методы внутри структуры.
- Наследование
Вложенность структур
- Полиморфизм
Указатели на функции методов родительского и дочернего классов различаются
Внутри структуры в языке C нет членских функций — так как же реализовать функцию, общую для родительской и дочерней структур? Можно попробовать имитировать её указателем на функцию. Но у такого подхода есть недостаток: указатели на функции родителя и потомка указывают не на таблицу виртуальных функций, как это устроено в C++, а на область физической памяти, и если имитируемых функций станет слишком много, сопровождение усложнится.
Чтобы имитировать полиморфизм, необходимо, чтобы переменные-указатели на функции были согласованы (полностью идентичны по содержимому и полностью согласованы по выравниванию переменных). Иначе указатель родительского класса, указывающий на объект дочернего класса, приведёт к аварийному завершению программы!
Учебный пример кода: c_examp.c
Похожие темы¶
- C++ чисто виртуальные функции и абстрактные классы | C++那些事
- C++ утверждения assert | C++那些事
- C++ битовые поля | C++那些事
- C++ константы const и его модификация | C++那些事
- C++ всё семейство const | C++那些事
- C++ оператор разыменования * | C++那些事
- C++ инициализация и присваивание | C++那些事
- C++ возврат нескольких значений | C++那些事
- C++ ключевое слово mutable | C++那些事
- C++ restrict и оптимизации компилятора | C++那些事