виртуальные функции — Механизм Vptr и Vtable в переполнении стека

В C ++ при динамическом связывании рассмотрим следующий пример …

class Base
{
virtual void fun()
{
cout<<"Base";
}
};

class Derived : Base
{
void fun()
{
cout<<"Derived";
}
};

int main()
{
Base *bptr;
Derived d;
bptr=&d;
bptr->fun();
}

Выходные данные вышеупомянутой функции «Производные» из-за объявления виртуального ключевого слова / динамического связывания.

Насколько я понимаю, будет создана виртуальная таблица (Vtable), которая содержит адрес виртуальных функций. В этом случае виртуальная таблица, созданная для производного класса, указывает на унаследованную виртуальную fun(), А также bptr->fun() будет решаться на bptr->vptr->fun();, Это указывает на саму унаследованную функцию базового класса. Мне не совсем понятно, как вызывается производная функция класса?

5

Решение

Только что прошел по этой ссылке виртуальная таблица и _vptr

Там написано, что рабочий процесс будет похож на ..

  1. base_ptr-> base_vptr —-> для проверки доступа виртуальной функции в базовом классе.

  2. base_ptr-> производная_vptr-> virtual_function () —> для вызова / вызова виртуальной функции.

Следовательно, виртуальная функция производного класса называется .. Надеюсь, вы найдете ее полезной.

6

Другие решения

И bptr-> fun () будет преобразован в bptr-> vptr-> fun () ;. Это указывает на саму функцию базового класса.

Неправильно. Derived vptr экземпляра (скрытое поле в каждом экземпляре) указывает на Derived виртуальные таблицы.

1

Стандарт не определяет механизм реализации полиморфизма. Стандарт говорит только о том, как он должен работать, а не о том, как поставщики компиляторов должны его реализовывать.

При этом у вас все в порядке с GCC под Linux и MSVC под Windows, и я ожидаю, что большинство других компиляторов будут похожими.

-1
По вопросам рекламы [email protected]