【问题标题】:why does the derived class inherit the private members of the base class? [duplicate]为什么派生类会继承基类的私有成员? [复制]
【发布时间】:2011-01-02 06:00:38
【问题描述】:

我知道派生类不能访问基类的私有成员,那为什么派生类要继承基类的私有成员呢?有没有有用的案例?

谢谢!

【问题讨论】:

  • 你正在学习 C++ 的那本书对这个主题有什么要说的?

标签: c++


【解决方案1】:

派生类需要私有成员,即使它不能直接访问它们。否则,它的行为将不会建立在它所派生的类之上。

例如,假设私人的东西是:

int i;

并且该类有 geti() 和 seti()。 i 的值必须放在某个地方,即使它是私有的,

【讨论】:

  • 先生,我承认,我很少遇到如此优雅和令人敬畏的答案。谢谢你先生这个答案特别是最后一行:))
【解决方案2】:

基类的public和protected方法仍然可以访问基类的private变量,这些方法在派生类中可用。

【讨论】:

    【解决方案3】:

    基类仍然可以使用私有成员变量和方法。

    如果您希望派生类能够访问成员但不让这些成员对外界隐藏,请将它们设为protected:

    这里有一个例子来说明:

    class Base
    {
    public:
      Base() : val(42.0f) {};
      float GetValue() const 
      {
        return val_;
      }
    private:
      float val_;
    };
    
    class Derived : public Base
    {
    public:
      float ComputedValue() const
      {
        return GetValue() * 2.0f;
      } 
    };
    

    【讨论】:

      【解决方案4】:

      不要忘记基类可能有不是private 的方法,因此派生类可以访问。那些protectedpublic 基类方法仍然可以调用private 基类方法。如果您想锁定基类中的核心功能,例如使用Template Method 设计模式实现,这将特别有用:

      class base
      {
      public:
      
        virtual ~base() { /* ... */ }
      
        virtual void base_func() { foo_private (); }
        virtual void do_func() = 0;
      
      private:
      
        void foo_private()
        {
          // pre-do_func() operations
      
          do_func();
      
          // post-do_function operations
        }
      
      };
      
      class derived : public base
      {
      public:
      
        void derived_func() { base_func(); }
      
        virtual void do_func()
        {
          // Derived class specific operations
        }
      };
      

      【讨论】:

        【解决方案5】:

        原因是派生类与超类有is-a 关系。

        派生类实例化是超类实例化...只是有更多(或更少由于将某些超类函数设置为私有)的东西。

        【讨论】:

        • 对于 OOP 新手来说非常困惑
        • @Jaywalker 我不明白这有多令人困惑。派生类 is-a 基类,并且其基组件仍然需要能够在其方法中访问 its private 变量,无论它是否允许派生类直接使用它们。
        【解决方案6】:

        正如此处其他答案所述,派生类在语法上无法访问基类的私有成员;但它需要在其内存布局中具有相同的副本。想想铸造。使用“C”转换,您可以将派生转换为私有基础。然后编译器需要正确的内存偏移量才能为基础对象生成有效的内存布局。

        例如。

        class Base {
        public: 
          void printA()  {
            a = 10;
            std::cout << a << std::endl;
          }
        private:
          int a;
        };
        class Derived : private Base{
          int b;
        };
        
        Derived* d = new Derived;
        Base* b = (Base*)d;
        b->printA();
        

        【讨论】:

          【解决方案7】:

          派生类不会以任何方式“继承”基类的私有成员 - 它无法访问它们,因此不会“继承”它们。

          派生类的实例包含基类的私有成员的实例,原因很明显。

          所以我什至不知道你这个问题是什么意思。

          【讨论】:

          • “派生类不会“继承”基类的私有成员”是的——除非你试图分裂句法。
          • 我认为“继承”他的意思是“可以访问”——这是对这个问题最不荒谬的解释。
          【解决方案8】:

          在创建派生类对象时,还会调用基类构造函数来创建基类对象。如果基类的私有成员没有分配内存,则基对象将是不完整的。

          因此派生类对象继承基类的私有成员,因为它们是在创建基类对象期间创建的,但由于它们是私有的,所以不可访问。

          【讨论】:

            【解决方案9】:

            虽然私有成员不能从基类访问,但它们被基类继承,因为派生类在非私有函数的帮助下使用这些属性。

            基类的私有成员不是直接访问的,而是由基类逐个派生的。

            【讨论】:

              猜你喜欢
              • 2017-04-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-10
              • 2013-02-12
              • 2014-11-27
              • 1970-01-01
              • 2013-10-23
              相关资源
              最近更新 更多