C ++ вопросы наследования - PullRequest
       5

C ++ вопросы наследования

0 голосов
/ 10 сентября 2011

Когда бы вы использовали:

  • Частный конструктор / деструктор?
  • Защищенный конструктор / деструктор?

  • Защищенный унаследованный основной класс?
    Название класса: Защищенный Главный

  • Частный унаследованный основной класс?
    Название класса: Private Main

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

Ответы [ 3 ]

3 голосов
/ 10 сентября 2011
  • Частный конструктор / деструктор
  • Защищенный конструктор / деструктор
    • Я не знаю о защищенном деструкторе, но о защищенном конструкторе, когда это внутренний класс и вам нужен только класс и/ или дружественные классы / функции и подклассы, чтобы иметь возможность создавать себя.
  • Защищенный унаследованный основной класс
  • Частный унаследованный основной класс
2 голосов
/ 10 сентября 2011

Приватный конструктор / деструктор?

Приватный конструктор / деструкторы имеет смысл для любого типа класса, экземплярами объекта которого должен управлять какой-то другой manager класс (который, например, имеет список всех экземпляров класса, которым он управляет).Пример:

class AManager;

class A {
  private:
    friend class AManager;

    A() {};
    ~A() {};
}

class AManager {
  public:
    A* createA() { a = new A(); aList.add(a); return a; }
    void destroy(A* a) { aList.remove(a); delete a; }

  private:
    list<A> aList;
}

Защищенный конструктор / деструктор?

Если вы хотите, чтобы создавались только подклассы вашего класса (например, если ваш класс является просто абстрактнымкласс, но не имеет чисто виртуальных методов, поэтому его теоретически можно было бы создать, если бы он был общедоступными конструкторами):

class A {
  protected:
    A() {};
    ~A() {};
}

class A1: public A {
  public:
    A1() {}
}

class A2: public A {
  public:
    A2() {}
}

Это наиболее целесообразно как часть шаблона factory :

class AFactory {
  public:
    A* createA() {
      if(someCondition()) return new A1();
      else return new A2();
    }
    void destroyA(A* a) { delete a; }
  private:
    bool someCondition() { /*...*/ }
}

Методы create / destroy также могут быть статическими методами базового класса A, но тогда это становится немного сложнее из-за необходимости предварительных объявлений.Кроме того, в качестве альтернативы конструкторы A1 и A2 могут оставаться защищенными и AFactory быть другом A1 и A2.

Защищенный унаследованный основной класс?Частный унаследованный основной класс?

Что вы подразумеваете под Main классом?В любом случае непубличное наследование очень похоже на агрегацию, поэтому, если нет особой причины не делать этого, агрегацию следует отдавать предпочтению частному / защищенному наследованию.

2 голосов
/ 10 сентября 2011

Скотт Мейерс объясняет это так:

  • class D : public B: «D обеспечивает интерфейс B».

  • class D : private B: «D реализовано с использованием B».

  • (Защищенное наследование не так уж и полезно.)

Защищенный конструктор / деструктор полезен для классов, которые вы хотите использовать только вторым способом, то есть для предоставления реализаций для других классов. В этом случае только производный класс должен вызывать конструктор и деструктор, который, таким образом, может быть защищен.

A private конструктор означает, что только сам класс может создавать экземпляры самого себя, что популярно для шаблонов фабрики или создателя, где статическая функция-член возвращает указатель на экземпляр, но прямое конструирование класса экземпляры не желательны.

...