链接器抱怨vtable上未定义的引用

时间:2011-10-05 17:53:13

标签: c++ linker undefined vtable

我在fileType.h中有这段代码。

class FileType{
    private:
        School* m_school;
        string m_fileFormat;
        const string m_cfgFile;
        const string m_inputFile;

    public:
        FileType(string p_fileFormat, string p_cfgFile, string p_inputFile):
                 m_fileFormat(p_fileFormat), m_cfgFile(p_cfgFile), m_inputFile(p_inputFile) {};
        virtual bool parseInputFile();
        virtual bool writeOutputFile(const School& m_school);
        virtual bool checkFormat(); // TBD -- used to check the format of the input file
        virtual bool checkConstraints(); // TBD -- used to check things like only +ve 12 digit in the ID etc
        virtual ~FileType();
};

class XmlType:public FileType{

    public:
        XmlType(string p_fileFormat, string p_cfgFile, string p_inputFile):
            FileType(p_fileFormat, p_cfgFile, p_inputFile) {};
        virtual bool parseInputFile();
        virtual bool writeOutputFile(const School& m_school);
        virtual bool checkFormat(); // TBD -- used to check the format of the input file
        virtual bool checkConstraints(); // TBD -- used to check things like only +ve 11 digit in the ID etc

};


class CsvType:public FileType{

    public:
        CsvType(string p_fileFormat, string p_cfgFile, string p_inputFile):
            FileType(p_fileFormat, p_cfgFile, p_inputFile) {};
        virtual bool parseInputFile();
        virtual bool writeOutputFile(const School& m_school);
        virtual bool checkFormat(); // TBD -- used to check the format of the input file
        virtual bool checkConstraints(); // TBD -- used to check things like only +ve 11 digit in the ID etc

};

我的主要内容是:

#include "fileType.h"

    FileType *inputFilePtr, *outputFilePtr;
    string stringOne, stringTwo, stringThree;
    inputFilePtr = new CsvType(stringOne, stringTwo, stringThree);

现在我的链接器告诉我,我不知道构造函数的符号:

/cygdrive/c/Users/Owner/AppData/Local/Temp/cclieUAi.o:main.cpp :(。text $ _ZN7CsvTypeC1ESsSsSs [CsvType :: CsvType(std :: basic_string,std :: allocator&gt;,std) :: basic_string,std :: allocator&gt;,std :: basic_string,std :: allocator&gt;)] + 0x1bf):对FileType'的vtable for CsvType' /cygdrive/c/Users/Owner/AppData/Local/Temp/cclieUAi.o:main.cpp:(.text$_ZN8FileTypeC2ESsSsSs[FileType::FileType(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x3a): undefined reference to vtable的未定义引用 collect2:ld返回1退出状态

我尝试使用两个整数创建一个虚拟构造函数,但什么都不做。这很有效,但是一旦我输了字符串,这就失败了。知道什么是错的吗?

2 个答案:

答案 0 :(得分:2)

您只定义了构造函数,但是您还没有定义虚函数。只宣告它们是不够的。你也要定义它们,这意味着,函数应该有函数体,包含一些语句(尽管它也可以是空白的)。

//file.h
class A
{ 
   virtual void f(); //this is called declaration
};

//file.cpp
void A::f() //this is called definition
{
  //this is called function-body.
}

答案 1 :(得分:0)

你声明了虚拟析构函数但你的子类没有!

其中virtual ~CsvType() { }virtual ~XmlType() {}

如果这是一个抽象基类,您可以考虑将{File>的函数设置为纯virtual bool parseInputFile() = 0;虚拟,这样就无法构造FileType对象。

virtual bool parseInputFile() {}之后,您不需要;