когда использовать используя объявление?

Я знаю ниже using C1::fn; перенесет функции fn (…), объявленные в C1, в C2, но я хочу знать, что лучше для этого делать using в дизайне?

Если функции fn () не используют состояние C1, я должен объявить вспомогательный класс, это лучший способ?
Если функции fn используют состояние C1, using нарушая инкапсуляцию?

Буду признателен, если вы упомянете некоторые примеры использования в C ++ 11. Как с помощью using Base::Base; конструктор вместо вызова его из производного члена инициализатора?

class C1
{
//...
public:
int fn(int j) { ... }
double fn(double w) { ... }
void fn(const char * s) { ... }
};

class C2 : public C1
{
//...
public:
//...
using C1::fn;
double fn(double) { ... };
};

4

Решение

Если функции fn используют состояние C1, используется ли нарушение инкапсуляции?

это using оператор не нарушает инкапсуляцию; это не разоблачает private состояние от C1 или предотвращение сохранения его инвариантов C1. Это чисто удобный способ разоблачения любого другого fn члены C1 имеет — в этом случае int fn(int) — так что их можно учитывать при разрешении звонков. Думайте об этом как о функционально эквивалентном …

class C2 : public C1
{
...
inline int fn(int j) { return C1::fn(j); }
};

…но лучше, потому что вам не нужно вручную добавлять и удалять функции для синхронизации со списком перегрузок C1.

Если функции fn () не используют состояние C1, я должен объявить вспомогательный класс, это лучший способ?

Если они не используют состояние C1, то они должны быть статическими или не являющимися членами. Вспомогательные классы, на мой взгляд, ужасная идея. Пространства имен являются нормальным методом группировки функциональности в C ++. Я полностью осведомлен о рекомендациях профессора Лакоса использовать классы и понять все аргументы, и все еще не согласен. Буду рад пройтись по нему, если упоминание о вспомогательных классах будет для вас чем-то большим, чем просто мимолетным.

6

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

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

Мой коэффициент таков, что код доступа C2 (например, через C2 *pc) знает что C2 происходит от C1 и поэтому ожидает, что сможет позвонить C1 функционирует через pc,

1

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