我有一个类A,它有一个声明为私有的字段val。 我想声明一个从A继承且可以访问val的类B。 在C++中有没有这样做的方法?
我的目的是需要重载A的一些函数,而不改变A的代码。
谢谢。
我有一个类A,它有一个声明为私有的字段val。 我想声明一个从A继承且可以访问val的类B。 在C++中有没有这样做的方法?
我的目的是需要重载A的一些函数,而不改变A的代码。
谢谢。
简短回答:你不需要这样做。这就是protected
关键字的作用,如果你想授权子类访问但不允许任何其他人访问,则应使用该关键字。
private
表示没有人可以访问这些变量,甚至包括子类。
如果你完全不能更改A
中的代码,也许有一个public
/protected
访问方法可以访问该变量。否则,这些变量不应从子类中访问,只有黑客行为才能帮助你(我不鼓励这么做!)。
基类的私有成员只能被基类成员函数(而不是派生类)访问。所以你没有任何权利,甚至没有机会去这样做 :)
class Base
如果您可以访问基类,则可以将 class B 声明为 友元类。但正如其他人所解释的那样:因为您可以这样做,并不意味着这是一个好主意。如果您希望派生类能够访问它们,请使用受保护成员。
friend
类并不是那么常用,所以他们不知道这个特性,或者因为他们来自一个没有这样东西的语言),2)提到了这不是一个好主意。当然,更好的回答应该是解释为什么这不是一个好主意。 :) - rbaleksandar在这篇“每周大师”文章中描述的方法是可行的 - 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;
}