Я тоже запутался
class A
{
public:
A(){}
virtual ~A(){}
virtual const char * GetName() { return "1 Базовый класс\n";}
};
class B : public A
{
public:
B(){}
virtual ~B(){}
virtual const char * GetName() { return "2 Производный класс\n";}
};
int _tmain(int argc, _TCHAR* argv[])
{
A *p = new A();
printf("%s",p->GetName());
delete p;
p = new B();
printf("%s",p->GetName());
delete p;
return 0;
}
В данном случае функция GetName() была переопределена в производном классе. Те полностью вызывается другая функция, а базовой как бы не существует. Несмотря на то, что указатель типа базового класса, во втором случае произойдёт вызов функции из класса В.
Если всё же вызов родительской функции необходим (например часто это используется в функциях создания окошек), то это делается так:
class A
{
virtual BOOL Create(...);
};
class B : public A
{
virtual BOOL Create(...) { ..какие то действия..; return A::Create(...); }
};
Бываю случаи, когда функция обязана быть переопределена. Например, если базовый класс не содержит необходимых данных, тогда перегружаемая функция определяется как "чисто" виртуальная (pure virtual). В этом случае невозможно создание объекта производного класса, без переопределения такой функции.
class Figura
{
// базовый класс понятия не имеет,
// как должна быть нарисована каждая фигура
virtual void Draw(...) = 0;
};
class Krug : public Figura
{
virtual void Draw(...) { ..какие то действия..; }
};
class Kwadrat : public Figura
{
// ошибка Draw(...) не переопределена
};
Есстественно, что вызов чисто виртуальных функций невозможен, как и невозможно создание объекта базового класса, содержащего такие функции.