Ошибка наследования класса C ++ C2509 - PullRequest
1 голос
/ 11 ноября 2011

у меня два класса: первый .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<<"plaukia\n";
}
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 Ответ

4 голосов
/ 11 ноября 2011

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

  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 как виртуальный в базовом классе, вы не сможете представить альтернативную реализацию в производном классе (то есть переопределить it) и (2) если вы собираетесь переопределить функцию в производном классе, вы должны сказать, что это уже в точке объявления класса.

С другой стороны, вы можете просто перегрузить функцию в производном классе. В этом случае вам не нужно virtual в обоих случаях (хотя вам все равно нужно объявить функцию в заголовке Zuvis). Таким образом, ваша функция скрывает функцию с тем же именем в базовом классе и не переопределяет it.

Разницу между сокрытием и переопределением можно увидеть здесь:

Vandenynas* pv = new Zuvis();
pv -> danne(0, 0, 0); // (*)

Строка, помеченная (*), выполняет Vandenynas реализацию danne в случае скрытия и Zuvis реализацию в случае переопределения. Вы видите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...