c ++类继承错误C2509

时间:2011-11-11 14:04:41

标签: c++ class inheritance

我有两节课 第一: .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 个答案:

答案 0 :(得分:4)

我认为您需要以下内容:

  1. danne应该是虚拟的,
  2. danne应在类Zuvis的标题中声明。

  3. 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的标头中声明该函数)。这样你的函数隐藏基类中具有相同名称的函数,并且不会覆盖它。

    隐藏和覆盖之间的区别可以在这里看到:

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

    标记为(*)的行在隐藏的情况下执行Vandenynas的{​​{1}}实现,在覆盖的情况下执行danne的实现。你知道吗?