我重新学习C ++(意思是:温柔地对待我!:)。我有一个超类(Node
),它有一个抽象方法(step()
),必须在子类(TestNode
)中实现。它编译没有错误,没有任何警告,但链接它会导致:
bash-3.2$ g++ -Wall -o ./bin/t1 src/t1.cpp
Undefined symbols for architecture x86_64:
"typeinfo for test::Node", referenced from:
typeinfo for test::TestNode in t1-9f6e93.o
"vtable for test::Node", referenced from:
test::Node::Node() in t1-9f6e93.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
据我所知,我已经定义了"第一个非内联虚拟成员函数" (即TestNode::step()
)。
我已仔细阅读了错误消息,我已阅读过博文here并查看了其他一些SO帖子(Undefined symbols "vtable for ..." and "typeinfo for..."?,How to find undefined virtual functions of a classes和c++ a missing vtable error),但我觉得没有接近启蒙。
我错过了什么?
这是整个计划。
#include <stdio.h>
namespace test {
class Node {
public:
virtual Node& step(int count);
};
class TestNode : public Node {
public:
TestNode();
~TestNode();
TestNode& step(int count);
};
TestNode::TestNode() { }
TestNode::~TestNode() { }
TestNode& TestNode::step(int count) {
printf("count = %d\n", count);
return *this;
}
} // namespace test
int main() {
return 0;
}
答案 0 :(得分:10)
问题是您没有为Node::step()
提供任何实施。如果你真的希望Node没有步骤的实现,那么你应该使它成为一个纯虚函数Node::step(int count) = 0
,从而使Node成为一个抽象类(你不能直接实例化它)。否则,为Node :: step。
答案 1 :(得分:10)
据我所知,我已经定义了“第一个非内联虚拟成员函数”(即TestNode :: step())。
你似乎把定义与声明混淆了。你在基类中所拥有的只是没有定义的声明,即实现。
您需要将其设为纯虚拟或实现它,即使它只是一个空的{}。
class Node {
public:
virtual Node& step(int count);
};
快速解决方法可能是:
class Node {
public:
virtual Node& step(int count) = 0;
// ^^^ making it pure virtual
};
或:
class Node {
public:
virtual Node& step(int count) { };
// ^^^ empty implementation for now
};