полиморфизм
Полиморфизм — одна из важных особенностей объектно-ориентированного программирования. Буквальный смысл можно понимать просто как: множественные формы, множественные проявления. Фактически, основной смысл один и тот же. В объектно-ориентированном программировании это означает, что один и тот же метод будет иметь разные эффекты выполнения при выполнении разными объектами.
В частности, реализацию полиморфизма можно разделить на два типа: полиморфизм времени компиляции и полиморфизм времени выполнения. Первый — это конкретный рабочий процесс, который определяется при компиляции, а второй — это рабочий процесс, который определяется только во время выполнения программы. Это определение рабочего процесса является обязательным , также известным как связывание .
Привязка, которая подтверждается во время компиляции и подключения, называется статической привязкой . Перегрузка функций и создание экземпляров шаблонов функций, которые мы узнали ранее, попадают в эту категорию. Другой — подтвердить, какой фрагмент кода выполняется при его запуске, что называется динамической привязкой . В этом случае невозможно подтвердить, какой фрагмент кода выполняется при компиляции, но это можно подтвердить только после запуска программы. бегать.
Сравнивая эти два варианта, статическая привязка уже определила, как ее выполнять во время компиляции, поэтому она эффективна в выполнении, тогда как динамическая привязка должна быть медленнее, но ее преимуществом является гибкость; Оба имеют свои преимущества и разные сценарии использования.
Ниже мы приведем простой пример статической компоновки:
/************************************//Des: Демо-учебник по C++//Автор: Хуанг/ /Авторское право:www.dotcpp.com//Дата:20.12.2017 ********************************** *** ** *****/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this->y=y ;}двойная зона () {return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublerearea(){returnPI*r*r ;}};intmain(){PointA (10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area()<<endl;Point*p;p=&B;cout<< p->area()<<endl;Point&pp=B;cout<<pp.area()<<endl;return0;}
Определены два класса: класс точки и производный класс круга. Вы можете увидеть код основной функции и результаты четырех выходных областей.
Вы можете сравнить код, чтобы понять четыре вывода:
Первый cout выводит площадь A, которая является методом area в классе Point. Площадь равна 0, поэтому проблем нет.
Второй cout выводит площадь B, которая, очевидно, является методом площади производного класса Circle. Площадь, естественно, рассчитывается по формуле, и значение составляет 1256,64, что не является проблемой.
Третий cout выводит метод area объекта класса Circle, на который указывает указатель типа Point p. Он выводит 0, что, очевидно, является методом area в классе Point. То, что здесь реализует C++, — это статическая привязка, то есть при компиляции он определяет, какую область выполнять на основе типа p, поэтому оно равно 0.
Четвертый тип cout работает аналогичным образом. Он присваивает объект типа Circle ссылке типа Point. C++ также выполняет статическую привязку и также выводит 0.
Очевидно, это не тот результат, который мы ожидаем. На самом деле для указателей и ссылок мы предпочитаем выполнять методы реальных объектов, а не слепо определять типы указателей и ссылок.
Если вы хотите удовлетворить наши требования, независимо от типа указателя или ссылки, это должно быть гибко решено на основе фактического объекта, на который указывает. Затем нам нужно изменить этот метод статической привязки по умолчанию и использовать динамическую привязку, то есть гибко определяемую во время выполнения.
В следующем разделе виртуальные функции будут подробно объяснены каждому!