#c #class #inheritance
#c #класс #наследование
Вопрос:
сначала у меня есть два класса: файл .h
#ifndef Vandenynas_H
#define Vandenynas_H
#include <cstdlib>
#include <iostream>
#include <string>
#include "skaicioti.h"
using namespace std;
class Vandenynas {
public:
void danne (int i,int a, int a0);
void getdan();
string GetName ();
};
#endif
.cppfile
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
#include "Vandenynas.h"
skaicioti::v vektorV;
void Vandenynas::danne(int i,int a, int a0)
{
switch (i)
{
case 0:
vektorV.x=a-a0;
break;
case 1:
vektorV.y=a-a0;
break;
default:
vektorV.z=a-a0;
break;
}
}
второй:
файл .h
#ifndef Zuvis_H
#define Zuvis_H
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
#include "Vandenynas.h"
class Zuvis:public Vandenynas
{
public:
void plaukti();
};
#endif
.cpp-файл
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
#include "Zuvis.h"
skaicioti::v vektorZ;
void Zuvis::plaukti()
{
cout<<"plaukian";
}
void Zuvis::danne (int i,int a, int a0)
{
switch (i)
{
case 0:
vektorZ.x=a-a0;
break;
case 1:
vektorZ.y=a-a0;
break;
default:
vektorZ.z=a-a0;
break;
}
}
и когда я компилирую, я получаю ошибку:
zuvis.cpp (14) : ошибка C2509: ‘danne’: функция-член не объявлена в ‘Zuvis’
может быть, кто-нибудь может сказать мне, где моя ошибка?
Ответ №1:
Я думаю, вам нужно следующее:
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
как virtual в базовом классе, вы не сможете представить альтернативную реализацию в производном классе (то есть переопределить ее), и (2) если вы собираетесь переопределить функцию в производном классе, вы должны сказать это уже на этапе объявления класса.
В качестве альтернативы, вы можете захотеть просто перегрузить функцию в производном классе. В этом случае вам не нужно virtual
в обоих случаях (хотя вам все равно нужно объявить функцию в Zuvis
заголовке ‘s). Таким образом, ваша функция скрывает функцию с тем же именем в базовом классе и не переопределяет ее.
Разницу между скрытием и переопределением можно увидеть здесь:
Vandenynas* pv = new Zuvis();
pv -> danne(0, 0, 0); // (*)
Отмеченная строка (*)
выполняет Vandenynas
реализацию danne
в случае скрытия и Zuvis
реализацию в случае переопределения. Вы видите?
Комментарии:
1. итак, где точка наследования classe, я могу просто создать два отдельных метода в этих классах, где разница?
2. @Edgar: Я только что добавил это к ответу 🙂 Смотрите пример внизу.
3. @Edgar: наследование означает, что вы можете вызвать функцию базового класса, если у вас есть экземпляр производного класса, даже если вы не переопределяете / скрываете is в производном классе. Функция просто унаследована .