2016-05-11 4 views
4

Предполагая, что у меня есть эти два класса: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 
    } 
} 

Может ли какая-то поздняя привязка применяться к различным перегрузкам функций?

+0

Я немного запутан, эти перегрузки на самом деле работают, и правильная версия 'check' вызывается в зависимости от типа указателя, переданного функции. что вы ожидаете от этого? – johnbakers

+0

Я просто передаю указатель на суперкласс, очевидно. Мне нужно время выполнения, чтобы выбрать правильную перегрузку в зависимости от заостренного объекта. Это определение для позднего связывания – NoImaginationGuy

+0

Я вижу, не могла ли одна функция 'check' принимать указатель базового класса использовать' dynamic_cast' для настройки поведения для истинного базового типа? Вам нужно будет создать новый указатель, бросить его и протестировать результат, чтобы увидеть, удалось ли dynamic_cast проверять трансляцию. больше работы, но я думаю, что это то, что dynamic_cast для – johnbakers

ответ

4

Нет, динамическая отправка для функций, не являющихся членами, в настоящее время не является частью C++.

Теоретически возможно, но техника реализации не так прямолинейна, как для виртуальных функций. Было несколько предложений по расширению C++ с этим (ключевые слова: multimethods и множественная отправка), но до сих пор они не привели к конкретному предложению и принятому изменению языка.

+0

Так много интересного. Он должен быть добавлен к более новым стандартам C++. Я, вероятно, воспользуюсь им в своем Lang точно. Может быть, «виртуальный» атрибут, чтобы дать параметрам, или что-то вроде этого. – NoImaginationGuy

+0

Не забудьте прочитать литературу по этому вопросу. Это действительно нетривиальная проблема. –

-1

Это похоже на работу указателей функций.

void (*checkPtr)(Hello*); 
... 
void check(Hello *c) { 
    // Do something 
    } 
... 
checkPtr = ✓ 

Это не идеальный вариант, но подходит для временного связывания.