获取虚拟破坏者的重新定义错误

Getting the redefinition error for virtual destructor

本文关键字:定义 错误 新定义 虚拟 破坏者 获取      更新时间:2023-10-16

我有以下C 片段:

#include <iostream>
using namespace std;
class A
{
public:
    virtual ~A()
    {
    }
};
A::~A()
{
    
}
int main(int argc, char * argv [])
{
    return 0;
}

为什么我会遇到这些错误?:

错误:重新定义'a :: 〜a()'a :: 〜a()

错误:'Virtual A :: 〜A()'先前在此处定义

 virtual ~A()**

只需在类中使用以下内容

virtual ~A();

而不是

virtual ~A()
             {
              }

编译器实际上是在告诉您这里的问题是什么。您有两个实现 - 您的班级中有一个内联,另一个在这里

A::~A()
{
}

您不能同时拥有。

声明定义之间存在差异。C 遵循ODR-一个定义规则,即:您只需要定义一次

  • 声明=您让世界知道某些东西存在以及参数/返回类型

  • 定义=您为该功能/class/object/whything

  • 编写实际代码

在您的代码中,您有两个定义和一个声明。违反了ODR:

#include <iostream>
using namespace std;
class A
{
public:
    virtual ~A() < - declares a virtual destructor
    { <- defines the code (nothing) for the virtual destructor
    }
};
A::~A() <- defines the code AGAIN for the virtual destructor of the class A
{
}
int main(int argc, char * argv [])
{
    return 0;
}

这是不允许的,因此是错误。如果定义是:

#include <iostream>
using namespace std;
class A
{
public:
    virtual ~A()
    { 
       printf("World?");
    }
};
A::~A()
{
   printf("Hello?");
}

编译器不知道您是否要打印"你好?"还是"世界?"。

virtual 关键字在这里无济于事,因为它只会说:"如果一个类从该类衍生并具有驱动器,则使用多态性"。在这里谈论多态性的是,我会放手。

您将两次定义灾难 - 一次在班级中,一次外面。您需要,例如将内联定义更改为声明:

virtual ~A();

这是类定义内部灾难函数的定义

class A
{
    public:
               virtual ~A()
                     {
                      }
    };

这也是班级定义以外的驱动器定义。

 A::~A()
{
}

因此,您两次定义了破坏者,并报告了有关此错误的编译器。

您可以通过以下方式定义班级内部的破坏者

class A
{
    public:
               virtual ~A() = default;
};