C++ c++;类继承错误C2509
我有两节课 第一: .h文件C++ c++;类继承错误C2509,c++,class,inheritance,C++,Class,Inheritance,我有两节课 第一: .h文件 \ifndef Vandenynas\u H #定义Vandenynas_H #包括 #包括 #包括 #包括“skaicioti.h” 使用名称空间std; Vandenynas类{ 公众: void danne(int i、int a、int a0); void getdan(); 字符串GetName(); }; #恩迪夫 .cpp文件 #include <cstdlib> #include <iostream> #include
\ifndef Vandenynas\u H
#定义Vandenynas_H
#包括
#包括
#包括
#包括“skaicioti.h”
使用名称空间std;
Vandenynas类{
公众:
void danne(int i、int a、int a0);
void getdan();
字符串GetName();
};
#恩迪夫
.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;
}
}
#包括
#包括
#包括
#包括
#包括“Vandenynas.h”
斯卡西奥蒂:维克托夫;
void Vandenynas::danne(int i,int a,int a0)
{
开关(一)
{
案例0:
vektorV.x=a-a0;
打破
案例1:
vektorV.y=a-a0;
打破
违约:
vektorV.z=a-a0;
打破
}
}
第二:
.h文件
#ifndef Zuvis#H
#定义Zuvis_H
#包括
#包括
#包括
#包括
#包括“Vandenynas.h”
Zuvis类:公共Vandenynas
{
公众:
void plaukti();
};
#恩迪夫
.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.h”
维克托兹;
void Zuvis::plaukti()
{
我想你需要以下几点:
danne
应该是虚拟的
danne
应在类Zuvis
的标题中声明
问题在于(1)如果不在基类中将danne
声明为virtual,则无法在派生类中呈现替代实现(即重写它),以及(2)如果要重写派生类中的函数,则应该在类声明时就这样说
或者,您可能希望只重载派生类中的函数。对于这种情况,您不需要在这两种情况下都使用virtual
(尽管您仍然需要在Zuvis
的头中声明函数)。这样,您的函数在基类中隐藏同名函数,而不会重写它
隐藏和覆盖之间的区别可以在这里看到:
Vandenynas* pv = new Zuvis();
pv -> danne(0, 0, 0); // (*)
标记为(*)
的行在隐藏时执行Vandenynas
对danne
的实现,在重写时执行Zuvis
的实现。您看到了吗?我认为您需要以下内容:
danne
应该是虚拟的
danne
应在类Zuvis
的标题中声明
问题在于(1)如果不在基类中将danne
声明为virtual,则无法在派生类中呈现替代实现(即重写它),以及(2)如果要重写派生类中的函数,则应该在类声明时就这样说
或者,您可能希望只重载派生类中的函数。对于这种情况,您不需要在这两种情况下都使用virtual
(尽管您仍然需要在Zuvis
的头中声明函数)。这样,您的函数在基类中隐藏同名函数,而不会重写它
隐藏和覆盖之间的区别可以在这里看到:
Vandenynas* pv = new Zuvis();
pv -> danne(0, 0, 0); // (*)
标记为(*)的行
执行Vandenynas
对danne
的隐藏实现,以及Zuvis
对重写的实现。你看到了吗?那么类E的继承点在哪里,我可以在这个类中做两个不同的方法吗?@Edgar:我刚刚在答案中添加了这个:-)看到了吗例如在底部。@Edgar:Inheritation意味着如果你有一个派生类的实例,你可以调用基类的函数,即使你不重写/隐藏它在派生类中。这个函数只是被继承的。那么classe的继承点在哪里,我可以在这个类中做两个不同的方法,哪里有区别?@Edgar:我刚刚在答案中添加了这个:-)请参见底部的示例。@Edgar:Inheritation意味着,如果您有派生类的实例,您可以调用基类的函数,即使您没有重写/隐藏它在派生类中。该函数只是继承的。
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);
};
Vandenynas* pv = new Zuvis();
pv -> danne(0, 0, 0); // (*)