Как перегрузка функций в c ++ работает без Diamond Inheritance? - PullRequest
0 голосов
/ 23 мая 2018

В приведенном ниже примере

void f(double, double);  // at global scope

struct Grandparent {
    void f(int);
    void f(double, double);
};

struct Parent : public Grandparent {
    void f(int);  // hides all overloads of Grandparent::f
};

struct Child : public Parent {
    void g() { f(2.14, 3.17); }  // resolves to Parent::f
};

Как объявление Parent :: f доминирует и скрывает все более наследственные объявления независимо от сигнатуры, то есть Parent::f(int) доминирует и скрывает объявлениеGrandparent::f(double, double), хотя две функции-члена имеют очень разные подписи?

Я сталкивался с этим примером через https://en.wikipedia.org/wiki/Dominance_(C%2B%2B)

1 Ответ

0 голосов
/ 23 мая 2018

Потому что скрыто имя ;подпись не участвует.В соответствии с правилом поиска имени ,

поиска имени проверяет области, как описано ниже, пока не найдет хотя бы одно объявление любого вида, в этот момент поиск останавливается идальнейшие области не рассматриваются.

В этом случае, когда имя f находится в области действия Parent, поиск имени останавливается;имена в Grandparent не будут рассматриваться вообще.(Кстати: после поиска имени в проверке разрешения перегрузки будет проверена подпись для выбора наилучшего совпадения)

Если это не то поведение, которое вы ожидали, вы можете ввести имена с помощью using.

struct Parent : public Grandparent {
    using Grandparent::f;
    void f(int);
};

struct Child : public Parent {
    void g() { f(2.14, 3.17); }  // refer to Grandparent::f(double, double)
};
...