声明虚拟析构函数但没有实现时会发生什么?

Gio*_*Gio -2 c++ inheritance virtual-destructor

在C++中,我们可以在头文件中完美地声明一个函数,而无需实际实现它.这编译很好,通常这不会提供任何问题,但是...我想知道它是否可以在未实现虚拟析构函数时导致问题.

当没有实现虚拟析构函数时,在这种情况下我们通过基类的指针删除派生类的实例,派生类的析构函数是否仍然会被调用?

例如

class Base{
public:
    virtual ~Base() {}
};

class Derived: public Base {
public:
    ~Derived(); // HAS NO IMPLEMENTATION
};

Base *b = new Derived();
delete b;
Run Code Online (Sandbox Code Playgroud)

注意:如评论中所述,上述示例未正确链接.这里提供的是解释我试图获得更多洞察力的情况,但是在链接过程中的实践中,这个例子将导致undefined reference to Derived错误.

Fra*_*eux 6

如果您曾经调用~Derived()(例如删除b),则会出现链接错误,因为析构函数的符号不存在.由于~Base()是虚拟的,~Derived()因此在删除时仍会(尝试)调用b.缺乏实施与此无关.