我过去常常编写我的虚拟析构函数的定义,即使它没有正确.今天我决定做一点测试来了解会发生什么.
dummy.h
#ifndef DUMMY_HEADER
#define DUMMY_HEADER
#include <iostream>
class Dummy
{
public:
virtual ~Dummy() {std::cout << "dummy destroyed" << std::endl;}
};
class DummyEx : public Dummy
{
public:
virtual ~DummyEx() {std::cout << "DummyEx destroyed" << std::endl;}
};
#endif
deleter.cpp
#include "dummy.h"
void deleteDummy(Dummy* dummy)
{
delete dummy;
}
main.cpp中
#include "dummy.h"
void deleteDummy(Dummy* dummy);
int main()
{
Dummy* dummy = new DummyEx();
delete dummy;
dummy = new DummyEx();
deleteDummy(dummy);
return 0;
}
我用g -c deleter.cpp编译了deleter.cpp,我得到了deleter.o
我用g -c main.cpp编译了main.cpp,得到了main.o
我用g deleter.o main.o链接了目标文件,我得到了a.out
当我执行a.out时,输出正如预期的那样,来自Dummy和DummyEx析构函数的cout都在那里.
但是,析构函数的编译定义到哪个目标文件?他们无法访问这两个目标文件,因为我在链接时没有收到多重定义错误.此外,编译器也没有内联析构函数,因为正确调用了虚函数.
最佳答案 这些定义是隐式内联的,只要它们在词法上是相同的,就允许存在多个定义.