Создание экземпляра объекта производного класса, чей базовый класс ctor является частным - PullRequest
11 голосов
/ 24 марта 2012

Как создать экземпляр объекта производного класса, чей базовый класс ctor является закрытым?

Поскольку производный класс ctor неявно вызывает базовый класс ctor (который является приватным), компилятор выдает ошибку.

Рассмотрим пример кода ниже:

#include <iostream>

using namespace std;

class base
{
   private:
      base()
      {
         cout << "base: ctor()\n";
      }
};

class derived: public base
{
   public:
      derived()
      {
         cout << "derived: ctor()\n";
      }
};

int main()
{
   derived d;
}

Этот код выдает ошибку компиляции:

accessing_private_ctor_in_base_class.cpp: в конструкторе derived::derived()': accessing_private_ctor_in_base_class.cpp:9: error: base :: base () 'является приватным accessing_private_ctor_in_base_class.cpp: 18: ошибка: внутри этого контекст

Как я могу изменить код, чтобы удалить ошибку компиляции?

Ответы [ 3 ]

16 голосов
/ 24 марта 2012

Есть два способа:

  • Сделать конструктор базового класса либо public, либо protected.
  • Или сделайте производный класс friend базового класса. см демо
2 голосов
/ 24 марта 2012

Вы не можете наследовать от базового класса, чей единственный конструктор является закрытым. 1

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


1. Если, как указывает Наваз, вы не являетесь другом базового класса.
1 голос
/ 24 марта 2012

Вы не можете.Это обычно является причиной того, что единственное, что не может быть приватным, запрещает наследование.

...