访问继承中的私有成员

access private members in inheritance

本文关键字:成员 继承 访问      更新时间:2023-10-16

我有一个类a,它有一个声明为私有的字段val。我想声明一个类B,它继承了a并且可以访问val。有办法在c++上实现吗?

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

谢谢。

快速回答:你不需要。这就是protected关键字的作用,如果您想授予对子类的访问权限,而不授予其他子类的访问权限,则需要使用该关键字。

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

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

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

class Base

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

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

这是可行的,正如本周大师- GotW #76 -访问权的使用和滥用所描述的那样。但这应该是最后的手段。

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

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