我有两节课
第一:
.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
.cpp文件
#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”中声明的成员函数
也许有人可以告诉我我的错误在哪里?
最佳答案
我认为您需要以下条件:
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
声明为虚拟的,则将无法在派生类中提供替代实现(即,将其重写);(2)如果您是要覆盖派生类中的函数,您应该已经在类声明时说了。或者,您可能只想重载派生类中的函数。对于这种情况,在两种情况下都不需要
virtual
(尽管您仍然需要在Zuvis
的 header 中声明该函数)。这样,您的函数将在基类中隐藏具有相同名称的函数,并且不会覆盖它。隐藏和覆盖之间的区别可以在这里看到:
Vandenynas* pv = new Zuvis();
pv -> danne(0, 0, 0); // (*)
标记为
(*)
的行在隐藏的情况下执行Vandenynas
的danne
的实现,在覆盖情况下执行Zuvis
的实现。你有看到?