В 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();
, Это указывает на саму унаследованную функцию базового класса. Мне не совсем понятно, как вызывается производная функция класса?
Только что прошел по этой ссылке виртуальная таблица и _vptr
Там написано, что рабочий процесс будет похож на ..
base_ptr-> base_vptr —-> для проверки доступа виртуальной функции в базовом классе.
base_ptr-> производная_vptr-> virtual_function () —> для вызова / вызова виртуальной функции.
Следовательно, виртуальная функция производного класса называется .. Надеюсь, вы найдете ее полезной.
И bptr-> fun () будет преобразован в bptr-> vptr-> fun () ;. Это указывает на саму функцию базового класса.
Неправильно. Derived
vptr экземпляра (скрытое поле в каждом экземпляре) указывает на Derived
виртуальные таблицы.
Стандарт не определяет механизм реализации полиморфизма. Стандарт говорит только о том, как он должен работать, а не о том, как поставщики компиляторов должны его реализовывать.
При этом у вас все в порядке с GCC под Linux и MSVC под Windows, и я ожидаю, что большинство других компиляторов будут похожими.