Давайте предположим следующий код:
// IInterface.h
#pragma once
class IInterface
{
public:
struct Thing
{
// If i uncomment this line, I can see that all object files increase in size.
// char data[10240];
int getOne() { return 1;}
};
// The interface doesn't really matter
};
// Derived1.h
#pragma once
#include "IInterface.h"
class Der1: public IInterface
{
public:
int getOne();
};
// Derived2.h
#pragma once
#include "IInterface.h"
class Der2: public IInterface
{
public:
int getOne();
};
// Derived1.cpp
#include "Derived1.h"
int Derived1::getOne()
{
Thing thing;
return thing.getOne();
}
// Derived2.cpp
#include "Derived2.h"
int Derived2::getOne()
{
Thing thing;
return thing.getOne();
}
// main.cpp
// Not really needed I guess?
#include "Derived1.h"
#include "Derived2.h"
int main(int argc, char* argv[])
{
Der1 der1;
Der2 der2;
return der1.getOne() - der2.getOne();
}
Теперь яЯ не уверен, как задать этот вопрос словам, но здесь я иду.
Почему метод IInterface :: Thing :: getOne не генерирует ошибки компоновщика, потому что он имеет несколько версий в разных единицах перевода?
Если бы я сделал версию, в которой getOne - это просто глобальная функция, объявленная и определенная в IInterface.h, это вызвало бы ошибки компоновщика.
Я знаю, что мог бы переместить структуру в отдельную.файл cpp, но так как это IInterface и я использую C ++ 17, мне не нужен файл .cpp.Нет.
О, и я нахожусь на MSVC 2019. Но мне интересно, работает ли этот код для GCC или других компиляторов.Мне придется провести несколько тестов.