小编Mar*_*Bąk的帖子

为什么在没有body的情况下调用纯虚方法不会导致链接器错误?

我今天遇到了相当奇怪的情况.在Interface构造函数中直接调用纯虚方法时,我得到一个未定义的引用错误.

class Interface
{
public:    
    virtual void fun() const = 0; 
    Interface(){ fun(); }
};

class A : public Interface
{
public:
    void fun() const override {};
};

int main()
{
    A a;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

prog.cc: In constructor 'Interface::Interface()':
prog.cc:5:22: warning: pure virtual 'virtual void Interface::fun() const' called from constructor
5 |     Interface(){ fun(); }
  |                      ^
/tmp/ccWMVIWG.o: In function `main':
prog.cc:(.text.startup+0x13): undefined reference to `Interface::fun() const'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

但是,使用不同的方法将fun()调用包装为:

class Interface
{
public:    
    virtual …
Run Code Online (Sandbox Code Playgroud)

c++ constructor virtual-functions pure-virtual undefined-behavior

2
推荐指数
1
解决办法
94
查看次数