我过去常常编写我的虚拟析构函数的定义,即使它没有正确。今天我决定做一些测试来了解会发生什么。
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;
}
我使用deleter.cpp
编译了g++ -c deleter.cpp
,我得到了deleter.o
我使用main.cpp
编译了g++ -c main.cpp
,我得到了main.o
我将目标文件与g++ deleter.o main.o
相关联,我得到了a.out
当我执行a.out
时,输出符合预期,来自Dummy
和DummyEx
析构函数的couts都在那里。
但是,析构函数的编译定义到哪个目标文件?他们无法访问这两个目标文件,因为我在链接时没有收到多重定义错误。此外,编译器也没有内联析构函数,因为虚函数被正确调用。
答案 0 :(得分:2)
定义是隐式inline
,只要它们在词法上是相同的,就允许存在多个定义。
答案 1 :(得分:0)
Functions declared in the body of a class are implicitly declared with inline
,因此在链接时不会遇到“多个定义”错误。