2008-09-30 4 views
3

Предположим, что у меня есть следующее заявление:Наследование из защищенных классов в C+++

class Over1 
{ 
    protected: 
     class Under1 
     { 
     }; 
}; 

Я знаю, что я мог бы сделать следующее:

class Over2 : public Over1 
{ 
    protected: 
     class Under2 : public Under1 
     { 
     }; 
}; 

Но есть способ объявить Under2 без Over2?

Поскольку вам нужно расширить Over1, чтобы использовать любую производную от Under1, это может показаться глупым, но в этой ситуации может быть 30 различных вкусов Under. Я могу либо:

  • Поместите их все в Over1: Не привлекательным, поскольку Over2 может использовать только 1 или 2 из них
  • Поместите их каждый в свою собственную версию Over: Не привлекательным с тех пор вы будет иметь , чтобы умножить наследование от почти того же класса.
  • Найти способ создать детей Under1 без создания детей Over1

Так это возможно?

Спасибо.

ответ

1

Используя шаблоны и явные специализации, вы можете сделать это только с одним объявлением класса в Over1.

class Over1 
{ 
protected: 
    class Under1 
    { 
    }; 

    template <typename T> 
    class UnderImplementor; 
}; 

struct Under2Tag; 
struct Under3Tag; 
struct Under4Tag; 

template <> 
class Over1::UnderImplementor<Under2Tag> : public Over1::Under1 
{ 
}; 

template <> 
class Over1::UnderImplementor<Under3Tag> : public Over1::Under1 
{ 
}; 

template <> 
class Over1::UnderImplementor<Under4Tag> : public Over1::Under1 
{ 
}; 

Надеюсь, это поможет.

1

Лучше, чем создавать вложенные классы, вы можете захотеть внедрить эти клопы в пространство имен. Таким образом, вам не нужен внешний класс, чтобы получить внутренний класс. В есть несколько отличных аргументов.

0

Если вы хотите сохранить защиту Under1, то по определению вам необходимо наследовать от Over1, чтобы получить к ней доступ. Я бы предложил сделать Under1 общедоступным или использовать пространства имен, как предложил Дуглас.

У меня нет компилятора, чтобы проверить это прямо сейчас, так что я не уверен, что это будет работать, но вы можете попробовать это:

class Over1 
{ 
    protected: 
     class Under1 
     { 
     }; 

    public: 
     class Under1Interface : public Under1 
     { 
     }; 
}; 

class Under2 : public Over1::Under1Interface 
{ 
}; 

Или, возможно, что-то вроде этого:

class Over1 
{ 
    protected: 
     class Under1 
     { 
     }; 
}; 

class Under2 : private Over1, public Over1::Under1 
{ 
}; 

Или даже:

class Under2; 

class Over1 
{ 
    friend class Under2; 

    protected: 
     class Under1 
     { 
     }; 
}; 

class Under2 : public Over1::Under1 
{ 
}; 

Хотя это подвергнет все Over1s рядовыми в Under2 - вряд ли что-то вам нужно.

0

Звучит как немного фанки для меня. Почему бы не попробовать структурировать свой код по-разному. Я думаю, что это может быть хорошим кандидатом на образец декоратора, где вы можете обернуть свой базовый класс различными декораторами для достижения желаемой функциональности, различные ароматы «под» могут быть декораторами. Просто мысль, трудно сказать, не зная больше о намерениях вашего кода.

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

  • Нет связанных вопросов^_^