Поведение виртуальной функции в производном классе от базового класса и абстрактного класса
В этой статье мы обсудим поведение виртуальной функции в производном классе и производном классе от абстрактного базового класса в C++.
Рассмотрим следующую программу:
Объяснение: Когда объявлен указатель базового класса , указывающий на объект производного класса , тогда объявляйте функцию как виртуальную только в базовом классе, когда необходимо переопределить ее в производном классе. Если функция объявлена как виртуальная в базовом классе, то не рекомендуется переопределять ее в производном классе, он все равно вызовет виртуальную функцию и выполнит ее.
Ключевое слово virtual работает только при переходе к полиморфизму времени выполнения и переопределении функции базового класса в производном классе. Если используется виртуальное ключевое слово и не рекомендуется переопределять эту функцию в производном классе, то виртуальное ключевое слово бесполезно. Это свойство не относится к абстрактному базовому классу, поскольку в базовом классе также нет тела функции. Ниже приведена программа, иллюстрирующая то же самое:
Программа 1:
Программа 2:
C++
// C++ program to illustrate the concept // of virtual function #include <bits/stdc++.h> using namespace std; // Base Class class Base { public : // Virtual Function virtual void print() = 0; }; // Derived Class class Derived : public Base { }; // Driver Code int main() { // Object of the derived class Base* b2 = new Derived(); // Function Call to Base Class b2->print(); return 0; } |
Выход:
Объяснение: Если сравнить две приведенные выше программы, когда функция абстрактного класса переопределяется, то ключевое слово virtual работает так, как и было задумано. Но в приведенной выше программе функция не была переопределена внутри базового класса, а также функция не была определена в базовом классе, что привело к ошибке компиляции.