Why does this not provide multiple definition error?

I used to write definitions of my virtual inline destructors for convenience, although this did not work. Today I decided to do a little test to understand what is happening.

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;
}

I compiled deleter.cppusing g++ -c deleter.cppand I gotdeleter.o

I compiled main.cppwith help g++ -c main.cppand gotmain.o

I linked the object files to g++ deleter.o main.oand I gota.out

When I execute a.out, the output was as expected, there were both cout of destructors Dummyand DummyEx.

? , . , , .

+4
2

inline, , .

+2
0

Source: https://habr.com/ru/post/1568955/


All Articles