我正在尝试编译以下代码:
#include <iostream>
class X{
public:
virtual void func();
};
class Y : public X{
public:
virtual void func(){
std::cout << "y" << std::endl;
}
};
int main(){
Y* y = new Y();
y->func();
return 0;
}
但是使用以下消息构建失败(在Xcode - C ++ 11上):
Undefined symbols for architecture x86_64:
"typeinfo for X", referenced from:
typeinfo for Y in c.o
"vtable for X", referenced from:
X::() in c.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)
但是,只要我在X中添加了func的实现,它就会成功构建。我很确定,虚拟方法是可选的,可以在超类中实现,但我不明白为什么会发生这种情况。此外,如果在main()中注释代码,它将成功构建。我假设问题是在main中调用func(),但Xcode没有将其列为运行时错误,它只表示构建时错误。
答案 0 :(得分:5)
如果您根本不想在基类中实现虚拟功能,只需将其标记为纯虚拟:
virtual void func() = 0;
答案 1 :(得分:0)
不,你错了。您需要实现非纯虚拟功能。如果您不想提供实现,则需要使用= 0
语法使函数纯虚拟化。