Во-первых, давайте представим нашу новую точку знаний — виртуальную функцию .
Что это за функция? Проще говоря, это функция, объявленная со словом virtual перед функцией. Общая форма выглядит следующим образом:
Возвращаемое значение виртуальной функции имя функции (формальный параметр) {тело функции}
Так для чего же он используется? Появление виртуальных функций позволяет устанавливать связь между функцией и телом функции во время выполнения, что представляет собой так называемое динамическое связывание . Затем, когда производный класс виртуальной функции запущен, эффект выполнения одного и того же метода, но с разными результатами, может быть достигнут в соответствии с динамическим связыванием во время выполнения, что является так называемым полиморфизмом. Таким образом, есть способ решить проблему из предыдущего раздела.
Далее нам нужно только объявить метод области в базовом классе как виртуальную функцию, и тогда любой указатель или ссылку типа Point в основной функции можно будет вызывать смело, и не нужно беспокоиться о проблемах с типами. Потому что они будут решать, какой метод вызывать, исходя из фактического типа объекта для достижения динамической привязки.
Код выглядит следующим образом:
/************************************//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;}virtualdoublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea (){ 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;}
После внесения изменений скомпилируйте и запустите следующим образом:
Пожалуйста, поэкспериментируйте на своем компьютере, чтобы ощутить роль виртуальных функций и полиморфизма.
Следует отметить следующее:
1. Виртуальные функции не могут быть статическими функциями-членами или дружественными функциями, поскольку они не принадлежат объекту.
2. Встроенные функции не могут динамически определять свое местоположение во время выполнения. Даже если виртуальная функция определена внутри класса, во время компиляции она все равно будет считаться невстроенной.
3. Конструктор не может быть виртуальной функцией, а деструктор может быть виртуальной функцией и обычно объявляется как виртуальная функция.