C++: конструктор защищенного класса

Если класс всегда будет наследоваться, имеет ли смысл делать конструктор protected?

class Base
{
protected:
    Base();
};

class Child : protected Base
{
public:
    Child() : Base();
};

Спасибо.


person Community    schedule 24.12.2010    source источник
comment
Между прочим, нет необходимости явно инициализировать Base.   -  person GManNickG    schedule 24.12.2010
comment
@GMan Это не точный пример того, что я делаю. Я просто написал как можно меньше кода, но при этом донес свою точку зрения.   -  person    schedule 24.12.2010


Ответы (2)


Это имеет смысл только в том случае, если вы не хотите, чтобы клиенты создавали экземпляры Base, а хотите, чтобы он был базовым классом некоторых [производных] классов, и/или намереваетесь использовать его друзьями Base (см. пример ниже) . Помните, что protected функции (и конструкторы) можно вызывать только из производных классов и friend классов.

class Sample;
class Base
{
    friend class Sample;
protected:
    Base() {}
};

class Sample
{
 public:
   Sample()
   {
      //invoking protected constructor
      Base *p = new Base();
   }
};
person Nawaz    schedule 24.12.2010

Если это всегда будет база («миксин»), то да. Имейте в виду, что класс с чистыми виртуальными функциями всегда будет базовым, но вам не нужно этого делать, так как он все равно не может быть создан.

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

person GManNickG    schedule 24.12.2010
comment
Только что понял, что защищенный невиртуальный деструктор был бы правильным решением для некоторых классов, которые я написал, которые используются полиморфно, но никогда не удаляются полиморфно. Я никогда не мог избавиться от предупреждения компилятора, предлагающего виртуальный деструктор, но это может сработать. - person Ben Voigt; 24.12.2010
comment
Если это имеет значение, в настоящее время я не планирую никаких чисто виртуальных функций. - person ; 24.12.2010
comment
@Jay: Итак, если класс не имеет смысла использовать как что-либо, кроме базы, создайте защищенный конструктор. - person GManNickG; 24.12.2010
comment
@Джей: Нет проблем. Только не попадитесь в ловушку путаницы. Его нельзя использовать, не будучи основой. с Я никогда не буду использовать его, если он не является базой.; последнее не подразумевает первое. - person GManNickG; 24.12.2010