Понимание того, какой метод будет вызван - PullRequest
0 голосов
/ 10 мая 2019

Класс Base имеет метод void foo(float a).Класс Sub публично наследуется от Base и имеет метод void foo(int a).

. У меня есть s экземпляр Sub (хранится в Sub*) и вызов s->foo(1.5).Выполняется Sub::foo (аргумент усекается до 1), а не Base::foo.Почему это так?

Я бы наивно ожидал, что он выполнит оригинальный метод, определенный в Base, считая аргумент плавающей точкой.Как я мог достичь этого вместо этого?

1 Ответ

4 голосов
/ 10 мая 2019

С

struct Base
{
    void foo(float a);
};

struct Sub : Base
{
    void foo(int a); // Hides Base::Foo
};

Sub::foo скрывает Base::foo,

Вы должны добавить using, чтобы разрешить обе перегрузки.

struct Sub : Base
{
    using Base::foo;
    void foo(int a);
};

Подробнее о using_declaration

А для вашего звонка:

Sub s;
s.foo(1.5); // Ambiguous with using, Sub::foo(int) without using.

без использования, рассматривается только одна перегрузка, поэтому вызывается Sub::foo(int).

При using учитываются обе перегрузки, но ни одна из них не лучше, чем другая, поэтому она неоднозначна.

...