Скрытие имени и доступ к не-виртуальной функции базового класса (синтаксис)

В следующем коде:

#include <iostream>

class A
{
public:
void f( float x ) { std::cout << 1; }
void g() { std::cout << 11; }
};

class B : public A
{
public:
void f( char x ) { std::cout << 2; }
void g() { std::cout << 22; }
};

int main()
{
B b;
b.A::f( 0 );
b.A::g();

return 0;
}

Разве это имя не скрывается? И где этот синтаксис определен в Стандарт (C ++ 11 или C ++ 03, не имеет значения, кажется, что они одинаковы для обоих стандартов)?

Я не знал, что это вообще возможно, это первый раз, когда я вижу такой синтаксис (увидел его здесь впервые: почему я не могу получить доступ к функции класса A в следующем коде? )

0

Решение

да, это имя скрывается. следовательно, это не перегрузка (и не переопределение). раздел 13.2 Declaration matching в N3485 объясняет об этом.

13.2 Declaration matching

1   Two function declarations of the same name refer to the same function if they are in
the same scope and have equivalent parameter declarations (13.1). A function member of
a derived class is not in the same scope as a function member of the same name in a base class.

[ Example:struct B {
int f(int);
};

struct D : B {
int f(const char*);
};
Here D::f(const char*) hides B::f(int) rather than overloading it.
void h(D* pd) {
pd->f(1); // error:
// D::f(const char*) hides B::f(int)
pd->B::f(1); // OK
pd->f("Ben"); // OK, calls D::f
}

—конец примера]

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]