C ++ динамическое связывание с перегрузкой - PullRequest
1 голос
/ 20 февраля 2012

Предположим:

struct A {
    virtual int foo(const A& a) const { return 1; }
};

struct B : A {
    virtual int foo(const A& a) const { return 2; }
    virtual int foo(const B& b) const { return 3; }
};

void testOverloadingBinding(const A& a,const B& b) {
    cout << a.foo(b);
}

int main() {
    testOverloadingBinding(B(),B());
}

Он печатает 2. Я бы предположил, что он печатает 3, поскольку this привязка является динамической, и, насколько я знаю, перегрузка имеет статическую привязку.Может кто-нибудь объяснить, как компилятор решает, какую функцию вызывать здесь?

Ответы [ 3 ]

4 голосов
/ 20 февраля 2012

This:

virtual int foo(const B& b) const;

не является переопределением для этого:

virtual int foo(const A& a) const;

Поэтому его никогда нельзя вызвать через ссылку на A.

1 голос
/ 20 февраля 2012

Перегрузка просто не доступна для разрешения.Объект, который вы вызываете foo, имеет тип A, а в A существует только одна функция foo(const A&).Динамическая диспетчеризация дает функцию в базовом классе.В C ++ функция-член идентифицируется по имени и аргументам.Добавление перегрузки в базу, которая не существует в родительском объекте, не включит динамическую диспетчеризацию.

1 голос
/ 20 февраля 2012
virtual int foo(const B& b) const;

ничего не переопределяет, поэтому компилятор выбирает первую функцию. Но, вероятно, в будущем у нас будет динамическое разрешение типов, и в этом случае компилятор выберет вторую функцию. Для получения дополнительной информации см. http://www2.research.att.com/~bs/multimethods.pdf

...