为什么虚函数必须在超类中实现?

时间:2017-08-01 19:43:59

标签: c++ xcode c++11

我正在尝试编译以下代码:

#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没有将其列为运行时错误,它只表示构建时错误。

2 个答案:

答案 0 :(得分:5)

如果您根本不想在基类中实现虚拟功能,只需将其标记为纯虚拟:

virtual void func() = 0;

答案 1 :(得分:0)

不,你错了。您需要实现非虚拟功能。如果您不想提供实现,则需要使用= 0语法使函数纯虚拟化。