【问题标题】:returning static member for virtual function, missing vtable for abstract class返回虚函数的静态成员,缺少抽象类的 vtable
【发布时间】:2016-10-29 15:29:51
【问题描述】:

这里是 cpp 的新手,请注意,前面可能是愚蠢的。

我在实现虚函数时试图返回一个静态属性。这个问题是一个链接器错误,指出该函数没有实现。我迷失了这个问题。

我能够使用以下精简代码重现错误:

#include <iostream>
#include <map>

class Abstract1 {
public:
    virtual char* getFoo();
};

class Base: public Abstract1 {
public:
    char* getFoo() {
        return Base::mapper[1];
    }
    static std::map<int,char*> mapper;
};

std::map<int, char*> Base::mapper;
int main(int argc, const char * argv[]) {
    Base::mapper[0] = "Hello!\n";
    Base::mapper[1] = "Goodbye!\n";
    Base* hello = new Base();
    // insert code here...
    std::cout << hello->getFoo() << "\n";
    return 0;
}

产生以下链接器错误:

Undefined symbols for architecture x86_64:
  "typeinfo for Abstract1", referenced from:
      typeinfo for Base in main.o
  "vtable for Abstract1", referenced from:
      Abstract1::Abstract1() in main.o

【问题讨论】:

  • 如果您打算从 Abstract1 指针中删除,您还需要添加一个虚拟析构函数。

标签: c++ linker linker-errors vtable undefined-function


【解决方案1】:

Abstract1::getFoo 只是虚拟的,而不是抽象的。

您可以将其设为抽象:virtual char * getFoo() = 0; 或提供默认实现。

【讨论】:

  • 就是这样!我认为那些是同一件事......我想我错了。需要了解更多!谢谢!
  • np,顺便说一句,实际术语是pure virtual
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 2018-04-05
  • 2011-11-12
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多