为什么这不会提供多重定义错误?

时间:2014-12-25 11:36:59

标签: c++ destructor

我过去常常编写我的虚拟析构函数的定义,即使它没有正确。今天我决定做一些测试来了解会发生什么。

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时,输出符合预期,来自DummyDummyEx析构函数的couts都在那里。

但是,析构函数的编译定义到哪个目标文件?他们无法访问这两个目标文件,因为我在链接时没有收到多重定义错误。此外,编译器也没有内联析构函数,因为虚函数被正确调用。

2 个答案:

答案 0 :(得分:2)

定义是隐式inline,只要它们在词法上是相同的,就允许存在多个定义。

答案 1 :(得分:0)

Functions declared in the body of a class are implicitly declared with inline,因此在链接时不会遇到“多个定义”错误。