Использование объявлений и константных перегрузок
Предположим, у меня есть две версии operator->
(перегружен на const) в базовом классе. Если я говорю
using Base::operator->;
в производном классе я получу доступ к обеим версиям или только к неконстантной?
3 ответа
Тот же бизнес, что и имя, скрывающееся. Это все или ничего. Использование объявлений (7.3.3) приносит имя, а не участника.
ИСО / МЭК 14882 (2003), 7.3.3. 1/ A-декларация использования вводит имя в декларативную область, в которой появляется декларация использования. Это имя является синонимом имени некоторой сущности, объявленной в другом месте.
Я призываю вас прочитать 7.3.3, внутри есть тонкие вещи. Вы не можете использовать-объявлять шаблон, все члены, на которые ссылается имя, которое вы используете-объявляете, должны быть доступны, имена учитываются для разрешения перегрузки вместе с именами в блоке, где находится объявление использования (т. Е. Они ничего не скрывают) и т. д. и т. д.
Вы получаете доступ ко всем версиям метода / оператора с одинаковым именем в этом родительском элементе.
И то и другое. ты пробовал это? (блин, этот ответ короткий: ну, вот пример:
#include <iostream>
#include <string>
struct bar
{
void foo() { std::cout << "non_c:foo()" << std::endl; }
void foo() const { std::cout << "c:foo()" << std::endl; }
};
class base
{
public:
bar* operator->() { return &b; }
bar const* operator->() const { return &b; }
private:
bar b;
};
class derived : public base
{
public:
using base::operator->;
};
int main(void)
{
const derived d = derived();
derived e;
d->foo();
e->foo();
}