Переопределение функции 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