ошибка наследования класса c C2509

#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:

Я думаю, вам нужно следующее:

  1. danne должен быть виртуальным,
  2. 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 в производном классе. Функция просто унаследована .