Я немного запутался в отношении виртуальных функций.
Предположим, у вас есть базовый класс с виртуальной функцией foo (), и эта функция затем переопределена в производном классе
class Baseclass
{
public:
virtual void foo()
{
//...
}
};
class Derived: public BaseClass
{
private:
int member_val;
public:
Derived( int init )
: member_val( init )
{}
void foo()
{
member_val++;
}
};
и foo, используя значение члена класса Derived, когда я пишу этот код
Derived d( 10 );
Base* bPtr = &d;
bPtr->foo();
foo () вызвал производный класс, потому что _vptr указывает на «виртуальную таблицу производного класса», а указатель в «виртуальной таблице производного класса» указывает на foo () из производного класса, но как тогда он нашел member_val, потому что базовый указатель не знает об этом. То, что «this» передается в foo () из производного класса. Мы называем его Base * (это базовый тип), но чтобы найти member_val, нам нужен Derived * (этот производный тип). Так как же это работает под капотом?