共享库的公共API中的纯虚函数(c ++)

时间:2013-06-09 19:29:46

标签: c++ linker polymorphism linker-errors

我创建了一个我在另一个应用程序中使用的共享库。共享库的核心功能之一是一个基类,用于检查泄漏的对象。

库中的代码如下:

// LeakCheck.hpp
#include <vector>
class LeakCheck
{
private:
    static std::vector<LeakCheck*> objects;
public:
    virtual const char *getClassName() const = 0;
    LeakCheck();
    ~LeakCheck();
    friend class LeakCheckMaster;
};

// LeakCheck.cpp
#include <iostream>
class LeakCheckMaster
{
    ~LeakCheckMaster()
    {
        if (LeakCheck::objects.size()>0) {
            std::cerr << "Leaked objects:" << std::endl;
            for (int i=0; i<LeakCheck::objects.size(); i++)
                std::cerr << LeakCheck::objects[i]->getClassName() << std::endl;
        }
    }
} master;
std::vector<LeakCheck*> LeakCheck::objects;
LeakCheck::LeakCheck()
{
     objects->push_back(this);
}
LeakCheck::~LeakCheck()
{
     objects->remove(this);
}

测试应用程序将是:

#include "LeakCheck.hpp"


class Test : public LeakCheck
{
    public:
        const char *getClassName() const
        {
             return "Test";
        }
};

int main()
{
    Test *a = new Test();
    return 0
}

然而,当我尝试链接应用程序时,我得到“未定义的引用LeakCheck :: getClassName()”。我确信我已经链接了共享库,因为其他功能可以正常工作。

这不是实际代码。我试图只留下问题所必需的代码。希望我没有错过任何东西。

那么为什么会出现这个链接器错误?如果我将它从纯虚拟更改为返回“未命名的类”。输出将所有对象报告为“未命名的类”,即使我已经实现了getClassName()函数。

是否不可能跨共享库边界进行抽象?

1 个答案:

答案 0 :(得分:1)

抽象方法也必须是虚拟的:virtual const char *getClassName() const = 0;