编译器是可以将隐式声明的虚析构函数的实现放在一个单独的翻译单元中的。下面是一个代码示例:
// header.h class Base { public: virtual ~Base() = default; };
// source.cpp #include "header.h"
// main.cpp #include "header.h"
int main() { Base* obj = new Base(); delete obj; return 0; }
在上面的示例中,Base类的虚析构函数在header.h中进行了隐式声明,然后在source.cpp文件中进行了实现。在main.cpp中,我们使用了Base类的析构函数来释放动态分配的对象。
编译器将在编译过程中将这三个文件分别编译为三个独立的翻译单元,然后在链接过程中将它们组合在一起。编译器会根据虚析构函数的声明和定义进行自动匹配,以确保正确的析构函数被调用。
需要注意的是,如果在不同的翻译单元中定义了多个具有相同函数签名的虚析构函数,将会引发链接错误。因此,应该确保只在一个翻译单元中提供虚析构函数的定义。