【问题标题】:C++ inheritance questionsC++ 继承问题
【发布时间】:2011-09-10 12:26:14
【问题描述】:

你什么时候使用:

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

  • 受保护的继承主类?
    类名:受保护的主要

  • 私有继承的主类?
    类名:私有主

如果它太宽泛,可以为每个问题提供一个简短的例子来说明你可能会在哪里使用它,因为我只是在寻找一个开始的想法。

【问题讨论】:

  • 我不打算详细回答这个问题,因为它的信息量很大,而且非常主观。我建议你阅读a good C++ book
  • 我认为受保护的继承是为了完整性而存在但实际上并没有任何严重用途的事物之一。我敢肯定,您可以通过从某些组件类受保护地继承来构建基类的情况,但这不是一个常见的习惯用法。
  • 我目前遇到继承/朋友问题,因此我正在寻找各种选项以产生想法和解决方案。
  • 这个问题太含糊了,最好的答案是:当设计要求时,或者当需要时...答案含糊不清......要么是那个,要么是一个关于继承的长教程,并不真正适合答案。
  • @SSight3:您应该尝试解释您要实现的目标(我猜这与列表/节点问题有关),解释实际要解决的问题是,您决定采取的方法,您放弃的方法以及原因。有了这些信息,您肯定会得到很多关于如何解决问题的好主意。

标签: c++ inheritance subclass


【解决方案1】:
  • 私有构造函数/析构函数
  • 受保护的构造函数/析构函数
    • 我不知道受保护的析构函数,但当这是一个内部类并且您只希望类和/或朋友类/函数和子类能够实例化自身时,是受保护的构造函数。
  • 受保护的继承主类
  • 私有继承的主类

【讨论】:

  • 当继承一个类时,如果你有 class Name : public Main (名字是伪名,不是实际的),你有 public typename,这意味着你也可以有 protected 和 private .我只是想知道这可能适用于什么情况?
【解决方案2】:

Scott Meyers 是这样解释的:

  • class D : public B: "D 提供接口B"。

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

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

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

private 构造函数意味着只有类本身才能创建自己的实例,这在工厂或创建者模式中很流行,其中静态成员函数返回指向实例的指针,但直接构造不需要类实例。

【讨论】:

    【解决方案3】:

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

    私有构造函数/析构函数对于任何类型的对象实例应该由其他一些 ma​​nager 类管理的类都有意义(例如,它具有它管理的类的所有实例的列表)。一个例子:

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

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

    Main 类是什么意思?无论如何,非公共继承与聚合非常相似,因此如果没有非常具体的理由不这样做,聚合应该优先于私有/受保护继承。

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 2011-09-01
      • 1970-01-01
      • 2021-01-04
      • 2010-11-25
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多