C ++继承问题

时间:2011-09-10 12:26:14

标签: c++ inheritance subclass

你什么时候使用:

  • 私有构造函数/析构函数?
  • 受保护的构造函数/析构函数?

  • 受保护的继承主类?
    class Name:Protected Main

  • 私人继承的主要班级?
    类名:Private Main

如果它太广泛,可以用一个实例的每个问题的一个简短示例,因为我只是在寻找一个开始的想法。

3 个答案:

答案 0 :(得分:3)

  • 私有构造函数/析构函数
  • 受保护的构造函数/析构函数
    • 我不知道受保护的析构函数,但是当这是一个内部类时,您只需要受保护的构造函数,并且您只希望类和/或朋友类/函数和子类能够实例化它自己。
  • 受保护的继承主类
  • 私有继承的主类

答案 1 :(得分:2)

Scott Meyers以这种方式解释:

  • class D : public B:“D提供界面B”。

  • class D : private B:“D是使用B”实现的。

  • (受保护的继承不是那么有用。)

受保护的构造函数/析构函数对于您希望仅以第二种方式使用的类非常有用,即为了提供其他类的实现。在这种情况下,只有派生类需要调用构造函数和析构函数,因此可以对其进行保护。

私有构造函数意味着只有类本身可以创建自身的实例,这对于工厂或创建者模式很流行,其中静态成员函数返回指向实例的指针,但直接构造不希望有类实例。

答案 2 :(得分:2)

  

私有构造函数/析构函数?

私有构造函数/析构函数适用于任何类对象实例应由其他 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() {}
}

这最有意义的是工厂模式的一部分:

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基类的静态方法,但由于需要前向声明,它会变得有点复杂。另外,作为替代方案,A1A2构造函数可以保持受保护,AFactory成为A1A2的朋友。

  

受保护的继承主类?   私有继承的主类?

Main课程是什么意思?在任何情况下,非公共继承与聚合非常相似,因此如果没有非常具体的原因,聚合应该优先于私有/受保护的继承。