纯虚函数C++中未定义的引用

问题描述 投票:0回答:3

我在运行需要运行的 C++ 程序时遇到了一些困难。问题本身不是我的,我必须让它编译。该算法非常庞大,因此对于我当前的错误消息,我将演示我生成的代码的更简化版本,它给出了完全相同的错误。这是代码:

class_1.h(class_1.cpp为空)

class class_1  {
public:
class_1();
virtual ~class_1();
virtual void function() =0;
};

class_2.h(class_2.cpp为空)

include"class_1.h";

class class_2 : public class_1{
public:
class_2();
virtual ~class_2();
virtual void function();
};

class_2a.h(class_2a.cpp为空)

include"class_2.h";

class class_2a : public flos2{
public:
class_2a();
virtual ~class_2a();
};

class_3.h

include "class_2a.h"
include "class_1.h" //I tried unsuccesfully without including class_1.h as well

class class_3 {
public:
class_3();
virtual ~class_3();
virtual void function();
private:
class_2a my_class_2a;
};

class_3.cpp

#include "class_3.h"

class_3::class_3()
:my_class_2a()
    {
    }

class_3::~class_3()
{
 this->function();
}

void flos3::function()
{
my_class_2a.function();
/***Main Body of function***/
}
};

我收到的错误是链接器错误:

undefined reference to `class_2::function()'

我知道,总的来说,整个算法似乎很愚蠢,但或多或少这就是我所得到的,我不允许改变结构本身,只是为了让它工作。正如您在

class_1
中看到的,函数被定义为纯虚函数,然后通过其他类调用。我真的不知道如何让这件事发挥作用,所以任何帮助将非常感激......

c++ class reference undefined pure-virtual
3个回答
0
投票

您需要添加:

class_1.cpp:

class_1::~class_1() = default;

class_2.cpp:

class_2::~class_2() = default;
void class_2::function() {
    // add code here (or not)
}

...等等。


0
投票

您收到链接器错误,因为您的函数

class_2::function()
没有实现。你需要添加它,最好是在class_2.cpp文件中。

void class_2::function()
{
    // Implementation goes here
}

所有虚拟析构函数都存在类似问题。他们也需要实施。


0
投票

当您将析构函数声明为纯虚拟时,您仍然需要为其提供定义。

// MyAbstractClass.h

class MyAbstractClass
{
    public:
        virtual ~MyAbstractClass() = 0;
};


// MyAbstractClass.cpp
// Put in the implementation, otherwise the linker will complain about the multiple definitions.
MyAbstractClass::~MyAbstractClass() = default;

否则,如果您尝试销毁

MyAbstractClass
的子类,链接器会抱怨,因为根本没有基类的析构函数的定义。

有关此问题的更多信息可以在

Effective C++: 55 Specific Ways to Improve Your Programs, Item 7
中找到。

© www.soinside.com 2019 - 2024. All rights reserved.