GeekyMukesh Ответов: 3

Как остановить наследование класса?


Согласно информации из интернета есть два способа создать окончательный класс:-
1. используя ключевое слово "final" после имени класса(c++11)
class end final
{ };

2. создав предфинальный класс с частным конструктором, сделав конечный класс другом предфинального класса и фактически унаследовав предфинальный класс в конечном классе.
class preFinal
{
  preFinal(){}
  friend class FINAL;
};
class FINAL:virtual public preFinal  //No class can derive this class.
{
};
class Derived:public FINAL //Compilation error,private constructor of preFinal class
{};


Но третий вариант, который я могу придумать, заключается в том, что если мы определяем конструктор в частном порядке, то мы также не можем наследовать класс, как показано ниже:-

class Final
{
   Final(){}
};
class Derived:public Final{  //This will give error as Final constructor is in private.
};
int main()
{
   Final fo;
}


Что я уже пробовал:

Тогда зачем нам нужно окончательное ключевое слово или создавать предфинальный класс(Вариант-2)?

Может ли кто - нибудь сообщить мне о любом случае, в котором мы можем наследовать класс с частным конструктором?

3 Ответов

Рейтинг:
10

Manish K. Agarwal

Если вы делаете конструктор как частный, чтобы сделать его окончательным, как вы сделаете объект этого класса?

class Final
{
private:
  Final(){}
public:
  // other members
};

void someFunc() {
   Final myFinal; // compilation error
}


Рейтинг:
1

GeekyMukesh

Спасибо Ричард,
Вы присылаете мне ссылку для окончательного описания ключевого слова. Я хотел бы знать, если я определяю конструктор в частном порядке, чтобы сделать класс окончательным, есть ли в нем что-то неправильное.

Кстати, по вашей ссылке я также узнал, что мы можем использовать ключевое слово "final" для предотвращения перегрузки виртуальной функции в производном классе. Так что теперь мне ясно, как использовать конечное ключевое слово. Но нужно ли нам следовать варианту 2, о котором я упоминал выше, когда мы можем достичь того же самого, просто держа конструктор в секрете?


Richard MacCutchan

Сделайте это правильно с правильной спецификацией языка. Если вы попытаетесь изобрести свою собственную работу, есть шанс, что это вызовет проблемы в будущем.

Кроме того, Пожалуйста, не публикуйте ответы в качестве решений (которыми они не являются), используйте кнопку ответа под сообщением, на которое вы ссылаетесь.