Насколько я знаю, когда мы делаем виртуальную функцию в базовом классе, указатель, на который можно ссылаться как vptr, создается компилятором, а vtable содержит записи виртуальной функции, которые являются последней версией для этого класса в случае переопределенной функции. и vptr указывает на vtable. классы, производные от базового класса, имеют ту же историю, они имеют указатель vptr и собственную vtable, которая содержит записи последней виртуальной функции. Чтобы понять мой вопрос, следуйте коду
#include <iostream>
using namespace std;
class base
{
public:
virtual void display(void)
{
cout << "base\n";
}
};
class derived : public base
{
public:
void display(void)
{
cout << "derived\n";
}
};
int main(void)
{
base *p;
base ob1;
derived ob2;
p=&ob2;
p->display();//my point starts from here
p->base::display();
}
В приведенном выше коде оператор p->display(); имеет смысл, что точки объекта p вызывают vptr этого класса и ищут функцию отображения в таблице vtable и связывают ее. Но я не понимаю, как бы я описал оператор p->base::display(); с точки зрения vptr и vtable. Как компилятор свяжет функцию отображения версии базового класса. Поскольку в vtable производного класса не будет функции отображения версии базового класса. Если что-то из того, что я знаю, здесь неправильно, пожалуйста, скажите мне, что правильно. И если я прав, то скажите мне, как я буду описывать p->base::display(); оператор с логикой, которую я описал p->display(); утверждение