Предполагая, что у меня есть эти два класса:C++ позднее связывание на функции перегружает
class Hello {
//members
public:
virtual int doit() {
return 3;
}
};
class Wow : public Hello {
//members
public:
virtual int doit() {
return 2;
}
};
int main(int argc, const char *argv[]) {
Hello *c = new Wow();
return c->doit();
}
Как все мы знаем, этот код будет обрабатываться поздним связыванием в C++, реализованный в LLVM IR по Clang, как это:
; ...
%7 = bitcast %class.Wow* %5 to %class.Hello*
store %class.Hello* %7, %class.Hello** %c, align 8
%8 = load %class.Hello*, %class.Hello** %c, align 8
%9 = bitcast %class.Hello* %8 to i32 (%class.Hello*)***
%10 = load i32 (%class.Hello*)**, i32 (%class.Hello*)*** %9, align 8
%11 = getelementptr inbounds i32 (%class.Hello*)*, i32 (%class.Hello*)** %10, i64 0
%12 = load i32 (%class.Hello*)*, i32 (%class.Hello*)** %11, align 8
%13 = call i32 %12(%class.Hello* %8)
; ...
Мой вопрос, что если я хочу создать функцию, называемую check
, например, в другом пространстве имен, как это:
namespace somewhereelse {
void check(Hello *c) {
// Do something
}
void check(Wow *c) {
// Do something else
}
}
Может ли какая-то поздняя привязка применяться к различным перегрузкам функций?
Я немного запутан, эти перегрузки на самом деле работают, и правильная версия 'check' вызывается в зависимости от типа указателя, переданного функции. что вы ожидаете от этого? – johnbakers
Я просто передаю указатель на суперкласс, очевидно. Мне нужно время выполнения, чтобы выбрать правильную перегрузку в зависимости от заостренного объекта. Это определение для позднего связывания – NoImaginationGuy
Я вижу, не могла ли одна функция 'check' принимать указатель базового класса использовать' dynamic_cast' для настройки поведения для истинного базового типа? Вам нужно будет создать новый указатель, бросить его и протестировать результат, чтобы увидеть, удалось ли dynamic_cast проверять трансляцию. больше работы, но я думаю, что это то, что dynamic_cast для – johnbakers