【问题标题】:access private members in inheritance在继承中访问私有成员
【发布时间】:2012-01-04 16:51:04
【问题描述】:

我有一个 A 类,它有一个字段 val 声明为私有。 我想声明一个类 B,它继承自 A 并且可以访问 val。 有没有办法在 C++ 上做到这一点?

我想这样做是因为我需要重载A的一些函数,而根本不改变A代码。

谢谢。

【问题讨论】:

  • 你不能访问别人的类私有字段,不管它是不是祖先。如果你没有公开的 getter/setter 方法,那你就倒霉了。
  • 如果您发布一个完整的、最小的示例程序,我们可以编译和测试来说明您正在尝试做什么,这个问题会更好。
  • 您可以将 A 中的数据/成员函数与 B 中的数据“隐藏”在一起。它根本不会修改 B 中的数据。它与重载不同,但在某些情况下它可能会完成这项工作。

标签: c++ inheritance private


【解决方案1】:

快速回答:你没有。这就是 protected 关键字的用途,如果您想授予对子类的访问权限但没有其他人,您可以使用它。

private 意味着没有人可以访问这些变量,甚至是子类。

如果您根本无法更改A 中的代码,则可能有一个public/protected 访问该变量的方法。否则,这些变量不应该从子类中访问,只有 hack 可以提供帮助(我不鼓励这样做!)。

【讨论】:

  • 你如何看待父类中的私有纯虚方法?为什么编译器会显示错误来覆盖它?这意味着他们正在继承?
  • @UnKnown:是的,纯虚函数需要被重写才能使用基类。
  • 意思是私有成员继承?因为在将纯虚方法声明为私有编译器后,我错误地重写了。
  • 拥有一个纯虚拟私有函数有点违背它的目的:建立一个接口,继承类必须实现。
  • @Constantinius 这不是真的; f.e.看看isocpp.org/wiki/faq/strange-inheritance#private-virtuals
【解决方案2】:

您需要将其定义为protected。受保护的成员被继承到子类,但不能从外部世界访问。

【讨论】:

  • 继承受保护成员后,可以提供公共访问。那么我们应该避免将个人数据保存在受保护的访问说明符中。
【解决方案3】:

基类的私有成员只能由基成员函数(而不是派生类)访问。所以你没有权利甚至没有机会这样做:)

class Base

  • public:任何人都可以访问
  • private:只能由基成员函数访问(不能 派生类)
  • protected:可以被基成员函数和派生函数访问 课程

【讨论】:

    【解决方案4】:

    好吧,如果您有权访问基类,则可以将 B 类声明为friend class。但正如其他人解释的那样:因为你可以,这并不意味着这是个好主意。如果您希望派生类能够访问它们,请使用受保护的成员。

    【讨论】:

    • 我真的很惊讶这没有被评为更高,因为它做了两件事:1)给出正确答案(这里的大多数答案基本上说这是不可能的,可能是因为friend类并没有被广泛使用,因此他们只是不了解此功能和/或因为它们来自没有类似功能的语言)和 2)提到这不是一个好主意。更好的答案是说为什么这当然不是一个好主意。 :)
    【解决方案5】:

    这是可行的,如本周 Guru - GotW #76 - Uses and Abuses of Access Rights 中所述。但它应该被视为最后的手段。

    【讨论】:

    • 我已经知道#define 技巧了,但是这个页面太棒了!谢谢!
    • 这是解决我实际问题的唯一答案 - 供应商的库有几个错误的方法,我宁愿提供它们的固定版本而不是复制和修改整个库。
    【解决方案6】:

    您可以通过 A 的继承成员函数访问基类 A 的私有成员

    #include<iostream>
    using namespace std;
    
    class A{
        int a;
        
        public:
        A(){};
        A(int val){a=val;};
        
        int get_a(){//To access a private variable it must be initialized here
            a=10;
            return a;
        }
    };
    
    class B: public A{
        int b;
        
        public:
        B(){};
        B(int val){b=val;};
        
        void get(){
            cout<<get_a();
        }
    };
    
    int main(){
        A ob1(2);
        cout<<ob1.get_a()<<endl;
        
        B ob2(4);
        ob2.get();
        
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 2011-02-10
      • 2020-09-01
      • 2018-05-11
      • 1970-01-01
      相关资源
      最近更新 更多