2013-11-25 3 views
1

Я действительно не понимаю, когда мне нужно ключевое слово using. Всегда ли вам это нужно, когда вы хотите использовать функцию или объект из базового класса? Я считаю, что я должен использовать его, даже если я не перегружаю функцию.ключевое слово `using` для поведения по умолчанию из базового класса

+3

Вам нужно узнать об пространствах имен. – SLaks

+1

@SLaks вопрос OP имеет [ничего общего с пространствами имен] (http://en.cppreference.com/w/cpp/language/using_declaration) – Mgetz

ответ

2

Есть только два случая, когда вам нужно использовать using в классе. Во-первых, когда вы определяете функцию в классе с тем же именем, что и в базовом классе, и вы хотите использовать перегрузку с учетом обоих из них. Другой - когда вы хотите использовать конструктор базового класса как производный конструктор.

+0

Есть ли разница в этом правиле, если базовый класс является шаблоном? – Plamen

+0

@Plamen, я не понимаю, почему наличие шаблона для базового класса имеет значение, но я не могу его окончательно сформулировать. –

+0

Спасибо за ваш ответ! Я думаю, что это имеет значение, если вы используете шаблоны. Я выполнял некоторые тесты, и кажется, что компилятор не может понять, что делать, когда используется параметр шаблона. У меня есть функция «глупо» в базе и получить «error: нет аргументов для« глупостей », которые зависят от параметра шаблона, поэтому должно быть доступно объявление« глупо »[-fpermissive]', если я использую его в полученный (он не обновляется, только используется). – Plamen

2

Вам нужно только using -directive для членов базового класса, когда вы перегружать соответствующее имя в производном классе и вы хотите сделать базовый класс перегружает видимым. Когда вы не перегружаете имя в выбранном классе, вам вообще не нужен директиву using.

Фон состоит в том, что было сочтено удивительным, если изменение базового класса приведет к перегрузке функции. Таким образом, перегрузки из базовых классов по умолчанию скрыты. Если вы хотите, чтобы их использовали, вы делаете перемену explucit.

Предположим, что правило не было на месте и рассмотрим производный класс, определяющий член f(double), который называется object.f(0). Если базовый класс изменен, чтобы обеспечить f(int), и отображаются перегрузки, новая функция будет лучше соответствовать. То есть, не будучи видимым до того, как поведение будет тихо изменено. Это, наверное, плохая идея.

0

Вы должны использовать его, если имеете дело с пространствами имен. Например:

using namespace std; 
using std::cout; 
using std::endl; 
// without that you have to type it in following way 
std::cout << std::endl; 
// which is not the best way if you use it very often, 
// but good if you want to use some names in your code 

Это позволяет использовать некоторые библиотеки, которые имеют пространства имен. Он создан для инкапсуляции (скрытия) переменных, классов и методов, в противном случае это займет больше пространства имен и запретит вам использовать некоторые имена в вашем проекте.

+0

Вопрос OP имеет [ничего общего с пространствами имен] (http://en.cppreference.com/w/cpp/language/using_declaration) – Mgetz

Смежные вопросы