Я нашел несколько отличных тем на этом сайте для этой темы, и тема полиморфизма прояснена для меня, но я просто запутался, как именно виртуальная функция работает по сравнению с нормальной функцией.
(пример, приведенный в этой теме Зачем нам нужны виртуальные функции в C ++? ):
class Animal
{
public:
void eat() { std::cout << "I'm eating generic food."<<endl; }
};
class Cat : public Animal
{
public:
void eat() { std::cout << "I'm eating a rat."<<endl; }
};
void func(Animal *xyz) { xyz->eat(); }
Итак, у нас есть функция и производная функция, которая былапереопределены.
Cat *cat = new Cat;
Animal *animal = new Animal;
animal->eat(); // Outputs: "I'm eating generic food."
cat->eat(); // Outputs: "I'm eating a rat."
func(animal); // Outputs: "I'm eating generic food."
func(cat); // Outputs: "I'm eating generic food."
Таким образом, мы не можем получить доступ к желаемой функции, если она не является виртуальной функцией.Но почему именно?
Если работает следующее:
Cat cat;
Animal animal;
animal.eat(); // Outputs: "I'm eating generic food."
cat.eat(); // Outputs: "I'm eating a rat."
Тогда, предположительно, в памяти уже есть две разные функции eat без использования vtable.
Поэтому, когда мы делаем виртуальную функцию, каждый класс теперь получает свою собственную таблицу vTable со своими собственными функциями.Итак ... Мы просто храним функции в другом месте в памяти.Так что же происходит с указателем между тем, когда он вызывает обычную функцию через объект, и когда он вызывает виртуальную функцию через объект?
Как и в чем разница между: Animal-> eat ();// Вызов виртуальной функции и Animal-> eat ();// Вызов обычной функции
Когда мы объявляем виртуальную функцию, TutorialsPoint говорит
На этот раз компилятор смотрит на содержимое указателя, а не на его тип
Да, но как?Почему он не мог сделать это раньше?Предположительно, он просто хранится в памяти так же, как обычная функция.Это как-то связано с указателем Vtable в начале объекта?
Я просто ищу подробности, чтобы понять, почему.Я не хочу звучать так, будто я увяз в чем-то совершенно бессмысленном.Просто интересно по академическим соображениям.