Я думаю, вам нужно следующее:
danne
должно быть виртуальным,
danne
должно быть объявлено в заголовке класса Zuvis
.
class Vandenynas
{
public:
virtual void danne (int i,int a, int a0);
void getdan();
string GetName ();
};
class Zuvis : public Vandenynas
{
public:
void plaukti();
virtual void danne (int i,int a, int a0);
};
Проблема в том, что (1) если вы не объявите danne
как виртуальный в базовом классе, вы не сможете представить альтернативную реализацию в производном классе (то есть переопределить it) и (2) если вы собираетесь переопределить функцию в производном классе, вы должны сказать, что это уже в точке объявления класса.
С другой стороны, вы можете просто перегрузить функцию в производном классе. В этом случае вам не нужно virtual
в обоих случаях (хотя вам все равно нужно объявить функцию в заголовке Zuvis
). Таким образом, ваша функция скрывает функцию с тем же именем в базовом классе и не переопределяет it.
Разницу между сокрытием и переопределением можно увидеть здесь:
Vandenynas* pv = new Zuvis();
pv -> danne(0, 0, 0); // (*)
Строка, помеченная (*)
, выполняет Vandenynas
реализацию danne
в случае скрытия и Zuvis
реализацию в случае переопределения. Вы видите?