virtual

The virtual keyword says that a function can be overridden at run-time:

//
// g++ virtual.cpp
//
#include <iostream>
using namespace std;

class Animal
{
public:
  virtual void eat() { std::cout << "I'm eating generic food." << endl; }
};

class Cat : public Animal
{
public:
  void eat() { std::cout << "I'm eating a mouse." << endl; }
};
    
void func(Animal *a) { a->eat();} 

int main ()
{
  Animal *animal = new Animal;
  Cat *cat = new Cat;
  
  func(animal); 
  func(cat);    
  return 0;
}

To enforce that the derived class implements a function the pure virtual function syntax used:

//
// g++ virtual.cpp
//
#include <iostream>
using namespace std;

class Animal
{
public:
  virtual void eat() = 0;   // pure virtual function, no function body in the base class.
};

class Cat : public Animal
{
public:
  void eat() { std::cout << "I'm eating a mouse." << endl; }
};
    
void func(Animal *a) { a->eat();} 

int main ()
{
  Cat *cat = new Cat;
  
  func(cat);    
  return 0;
}