c – 为什么不提供多重定义错误?

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

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都在那里.

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

最佳答案 这些定义是隐式内联的,只要它们在词法上是相同的,就允许存在多个定义.

点赞