내가 대충 이해한 개념은

-------------------------------------------------------------------
#include <iostream>

using namespace std;

class animal
{
public:
 virtual void speak()
 {
  cout <<\"animal의 speak() 함수 호출\"<<endl;
 }
};

class dog:public animal
{
public:
 void speak()
 {
  cout <<\"dog의 speak() 함수 호출\"<<endl;
 }
};
class cat:public animal
{
public:
 void speak()
 {
  cout <<\"cat의 speak() 함수 호출\"<<endl;
 }
};

void main()
{
 animal *ani; //부모클래스인 animal 클래스 포인터 호출
 dog dg; //자식클래스인 dog 클래스 호출
 cat ct; //자식클래스인 cat 클래스 호출
 
 ani = &dg; //animal 클래스를 dog 클래스와 연결
 ani->speak();//animal 클래스 포인터로 dog 클래스의 speak() 함수 호출

 ani = &ct; //위와 상동
 ani->speak();//위와 상동
}

-----------------------------------------------------------------------
이렇게 소스코드가 있다고 하면

부모클래스인 animal 에 선언된 speak() 함수를 자식클래스인 dog에서 호출해서 재정의하여 다르게 쓰고
또 다른 자식클래스인 cat에서는 또 다르게 재정의하여 써서

받는 놈마다 다르게 받아들인다.

대충 이렇게 이해하고 있는데

맞아???