Если вы хотите сохранить 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
{
};
Хотя это могло бы раскрыть все ряды Овер1 для Under2 - маловероятно, что вы захотите.