наследование — C ++ позволяет производным классам друга иметь доступ к частному вложенному классу

Вот что я пытаюсь сделать:

class A
{
friend class C (and all of C's derived classes)
public:
void DoAThing() { mpMyC->DelegateResponsibility(myB); }

private:
class B
{
};
B mMyB;
C* mpMyC;
};

class C
{
// No problem here- C can see B
virtual void DelegateResponsibility(const A::B& necessaryInfo);
};

class D: public C
{
// Uh-oh- we don't inherit friendship
virtual void DelegateResonsibility(const A::B& necessaryInfo);
};

Короче говоря, у меня есть частный вложенный класс внутри A, потому что это деталь реализации A. Однако я бы хотел делегировать некоторые обязанности классов A и C, чтобы получить некоторое полиморфное поведение. Я хотел бы избежать необходимости добавлять строку класса друга каждый раз, когда кто-то наследует от C. Стандартный обходной путь, данный для производных классов друга, — «просто добавьте защищенную функцию доступа к базовому классу и переопределите ее для производных членов», но это только помогает получить доступ к закрытым членам класса A, а не к закрытым классам. Есть ли способ обойти эту проблему?

0

Решение

Это должно работать:

class C
{
typedef A::B MyB;
virtual void DelegateResponsibility(const MyB& necessaryInfo);
};

class D: public C
{
// Uh-oh- we don't inherit friendship
virtual void DelegateResonsibility(const MyB& necessaryInfo);
};
1

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

Вы можете поместить свой класс B в детальное пространство имен в области видимости файла.

что-то вроде этого:

namespace my_hidden_area {
class B {
...
}
}

Конечно, это не такая надежная защита, как закрытие вложенного класса, но это должно дать понять посторонним, что они не должны возиться с B.

Если вам интересно, почему дружба не наследуется, посмотрите на этот вопрос: Почему C ++ не позволяет наследственную дружбу?

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector