Как ограничить защищенное наследование членов только одним или несколькими поколениями?

мой class Dad предоставляет некоторые protected методы, которые понадобятся его детям, даже если он еще не знает, кем будут эти дети.

class Dad
{
protected:
void method()
{
// some amazing stuff (I swear)
};
};

Фактическое наследование class Child: public Dad, в текущей реализации моей программы, решил быть выведен на несколько классов class GrandKid1: Child, class GrandKid2: Child и т.п.

Но ради безопасности и организации, Child предпочитает, чтобы внуки не могли назвать method() сами. Как мне помешать им это сделать?

Очевидно, что следующий наивный код приводит к ошибке компоновщика:

class Child: public Dad
{
private:
void method();
};

Как мне сделать Child остановить распространение protected член method() к своим собственным производным классам?

2

Решение

Ты можешь использовать using директива для помещения члена в другой раздел.

class Dad
{
protected:
void Method() { std::cout << "Dad"; }
};

class Child : public Dad
{
private:
using Dad::Method;
};

class GrandChild : public Child
{
public:
void f1() { Method(); } // Generates compilation error
};
9

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

Если ваш реальный код не намного сложнее, чем ваш пример, вы можете просто использовать friend,

class Child;

class Dad
{
friend class Child;

private:
void method () {}
};

class Child : public Dad
{
void someothermethod ()
{
method ();
}
};
2

Вы должны на самом деле определять функция-член, не только объявить это:

class Child: public Dad
{
private:
void method() {}
};
1
По вопросам рекламы [email protected]