Предположим, у меня есть два класса с одинаковыми именами в одном и том же пространстве имен в двух разных файлах.
Затем вы нарушили правило под названием thd ODR или одно правило определения.Это делает вашу программу некорректной, диагностика не требуется.
Если у вас есть класс Alice
, который хочет использовать другой класс Bob
, но вы хотите два разных определения того, как работает Bob
,решения называются «полиморфизмом».
Полиморфизм - это способность двух или более классов заменить один.
Существует три простых формы полиморфизма.Здесь используется виртуальный интерфейс и полиморфизм времени выполнения.Есть использование шаблонов и время компиляции.Затем происходит стирание типов с помощью указателей на функции.
Самым простым является определение виртуального интерфейса.
struct IBob {
virtual int count() const = 0;
virtual ~IBob() {}
};
struct Alice {
std::unique_ptr<IBob> my_bob = nullptr;
void do_stuff() const {
if(my_bob) std::cout << "Count is:" << my_bob->count() <<"\n";
}
};
теперь мы можем определить две реализации IBob
:
struct Bob0:IBob{
int count() const final { return 7; }
};
struct Bob1:IBob{
std::unique_ptr<IBob> pBob;
int count() const final {
if(pBob) return pBob->count()*2 +1;
else return 1;
}
};
теперь Bob1
имеет IBob
, и он использует IBob
для реализации своих собственных count
.
Шаблонный путь выглядит следующим образом:
template<class Bob>
struct Alice {
Bob my_bob;
void do_stuff() const {
std::cout << "Count is:" << my_bob.count() <<"\n";
}
};
иразличные Bob
реализации не требуют virtual
или наследования.Здесь вы должны выбрать, какой Bob
во время компиляции в каждой точке использования.
Решение стирания типа указателя функции вручную является более сложным.Я бы посоветовал против этого.