Переопределение функции C++
Переопределение функций C++
В этом уроке мы узнаем о переопределении функций в C++ с помощью примеров.
Как мы знаем, наследование — это функция ООП, которая позволяет нам создавать производные классы из базового класса. Производные классы наследуют функции базового класса.
Предположим, что одна и та же функция определена как в производном, так и в базовом классе. Теперь, если мы вызовем эту функцию, используя объект производного класса, будет выполнена функция производного класса.
Это называется переопределением функции. в С++. Функция производного класса переопределяет функцию базового класса.
<час>Пример 1. Переопределение функции C++
// C++ program to demonstrate function overriding
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1;
derived1.print();
return 0;
}
Вывод
Derived Function
Здесь та же функция print()
определяется как в Base
и Derived
классы.
Итак, когда мы вызываем print()
из Derived
объект производный1 , print()
из Derived
выполняется путем переопределения функции в Base
.
Как мы видим, функция была переопределена, потому что мы вызывали функцию из объекта Derived
класс.
Если бы мы вызвали print()
функция из объекта Base
класс, функция не была бы переопределена.
// Call function of Base class
Base base1;
base1.print(); // Output: Base Function
<час> Доступ к переопределенной функции в C++
Чтобы получить доступ к переопределенной функции базового класса, мы используем оператор разрешения области видимости ::
.
Мы также можем получить доступ к переопределенной функции, используя указатель базового класса для указания на объект производного класса, а затем вызывая функцию из этого указателя.
Пример 2. Доступ переопределенной функции C++ к базовому классу
// C++ program to access overridden function
// in main() using the scope resolution operator ::
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1, derived2;
derived1.print();
// access print() function of the Base class
derived2.Base::print();
return 0;
}
Вывод
Derived Function Base Function
Вот это утверждение
derived2.Base::print();
обращается к print()
функция базового класса.
Пример 3. Вызов переопределенной функции C++ из производного класса
// C++ program to call the overridden function
// from a member function of the derived class
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
// call overridden function
Base::print();
}
};
int main() {
Derived derived1;
derived1.print();
return 0;
}
Вывод
Derived Function Base Function
В этой программе мы вызвали переопределенную функцию внутри Derived
сам класс.
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
Base::print();
}
};
Обратите внимание на код Base::print();
, который вызывает переопределенную функцию внутри Derived
класс.
Пример 4. Вызов переопределенной функции C++ с использованием указателя
// C++ program to access overridden function using pointer
// of Base type that points to an object of Derived class
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1;
// pointer of Base type that points to derived1
Base* ptr = &derived1;
// call function of Base class using ptr
ptr->print();
return 0;
}
Вывод
Base Function
В этой программе мы создали указатель Base
тип с именем ptr . Этот указатель указывает на Derived
объект производный1 .
// pointer of Base type that points to derived1
Base* ptr = &derived1;
Когда мы вызываем print()
функция с использованием ptr , он вызывает переопределенную функцию из Base
.
// call function of Base class using ptr
ptr->print();
Это потому, что хотя ptr указывает на Derived
объект, на самом деле это Base
тип. Итак, он вызывает функцию-член Base
.
Чтобы переопределить Base
функции вместо доступа к ней, нам нужно использовать виртуальные функции в Base
класс.
Язык C