访问继承中的私有成员

时间:2011-11-23 11:33:03

标签: c++ inheritance private

我有一个A类,它有一个声明为private的字段val。 我想声明一个B类,它继承自A并具有对val的访问权限。 有没有办法在C ++上做到这一点?

我想这样做是因为我需要重载A的某些功能,而根本不需要更改A代码。

感谢。

6 个答案:

答案 0 :(得分:44)

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

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

如果您根本无法更改A中的代码,则该变量可能存在public / protected访问方法。否则这些变量不能从子类访问,只有黑客可以帮助(我不鼓励!)。

答案 1 :(得分:16)

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

class Base

  • 公开 :任何人都可以访问
  • 私有 :只能由基本成员函数访问(不能 派生类)
  • 受保护 :可以由基本成员函数访问并派生 类

答案 2 :(得分:8)

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

答案 3 :(得分:3)

这是本周的本大师所描述的那样 - GotW #76 - Uses and Abuses of Access Rights。但它应该被视为最后的手段。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

您可以通过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;
}