Написать пост

Работа виртуальных функций в C++

Аватар Типичный программист

Виртуальная функция определяется vtable (виртуальной таблицей). Если какая-либо функция класса объявлена как виртуальная, создастся vtable, которая хранит адреса виртуальных функций этого класса. Для всех таких классов компилятор добавляет скрытую переменную vptr, которая указывает на vtable. Если виртуальная функция не переопределена в производном классе, vtable производного класса хранит адрес функции в родительском классе. Таблица vtable используется для получения доступа к адресу при вызове виртуальной функции. Механизм vtable позволяет реализовать динамическое связывание в C++.

Когда мы связываем объект производного класса с указателем базового класса, переменная vptr указывает на vtable производного класса. Это присвоение гарантирует, что будет вызвана нужная виртуальная функция.

Рассмотрим следующий код:

			class Shape {
	public:
	int edge_length;
	virtual	int circumference () {
		cout << "Circumference of Base Class\n";
		return 0;
	}
};
class Triangle: public Shape {
	public:
	int circumference () {
		cout<< "Circumference of Triangle Class\n";
		return 3 * edge_length;
	}
};
void main() {
	Shape *x = new Shape();
	x->circumference(); // "Circumference of Base Class"

	Shape *y = new Triangle();
	y->circumference(); // "Circumference of Triangle Class"
}
		

В предыдущем примере функция circumference — виртуальная функция из класса Shape, значит, она является виртуальной в каждом из произвольных классов (Triangle и т.д.). В C++ разрешены вызовы невиртуальных функций во время компиляции со статическим связыванием, а вызовы виртуальной функции допускаются при динамическом связывании.

Разбор взят из перевода книги Г. Лакман Макдауэлл и предназначен исключительно для ознакомления.Если он вам понравился, то рекомендуем купить книгу «Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT-компанию».

Следите за новыми постами
Следите за новыми постами по любимым темам
9К открытий9К показов