C++ c++;类继承错误C2509

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

我有两节课 第一: .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 <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); // (*)