我有一个简单的课程如下
class A {
protected:
int x;
};
class B:public A
{
public:
int y;
void sety(int d)
{
y=d;
}
int gety(){ return y;}
};
int main()
{
B obj;
obj.sety(10);
cout<<obj.gety();
getch();
}
如何在不创建protected
实例的情况下,从派生A::x
的实例设置class B
实例变量class A
的值。
编辑:我们可以使用B的对象访问A::x
的值吗?喜欢obj.x
?
答案 0 :(得分:10)
B
是 A
,因此创建B
的实例正在创建A
的实例。话虽这么说,我不确定你的实际问题是什么,所以这里有一些代码可以澄清事情:
class A
{
protected:
int x;
};
class B : public A
{
public:
int y;
int gety() const { return y; }
void sety(int d) { y = d; }
int getx() const { return x; }
void setx(int d) { x = d; }
};
int main()
{
B obj;
// compiles cleanly because B::sety/gety are public
obj.sety(10);
std::cout << obj.gety() << '\n';
// compiles cleanly because B::setx/getx are public, even though
// they touch A::x which is protected
obj.setx(42);
std::cout << obj.getx() << '\n';
// compiles cleanly because B::y is public
obj.y = 20;
std::cout << obj.y << '\n';
// compilation errors because A::x is protected
obj.x = 84;
std::cout << obj.x << '\n';
}
obj
可以像A::x
的实例一样访问A
,因为obj
隐含地是A
的实例。
答案 1 :(得分:1)
A::x
受到保护,因此无法从外部访问,A().x
或B().x
。然而,它可以通过A
的方法和直接继承它的方法(因为受保护而非私有)来访问,例如B
。因此,无论语义如何,B::sety()
都可以访问它(如x
或A::x
或B::x
,可以访问它(或{{1}}或纯{}}。
答案 2 :(得分:0)
您可以简单地将其称为B类中的x
例如:
class B : public A
{
public:
...
void setx(int d)
{
x=d;
}
};
答案 3 :(得分:0)
请注意,B没有对A :: x的完全访问权限。它只能通过B的实例访问该成员,而不是A类的任何内容或从A派生。
您可以使用以下方法:
class A
{
protected:
int x;
static int& getX( A& a )
{
return a.x;
}
static int getX( A const& a )
{
return a.x;
}
};
现在使用getX,从A派生的类(如B)可以到达任何A级的x成员。
你也知道友谊不是传递性的或继承的。通过提供访问功能,可以为这些情况提供相同的“解决方法”。
在你的情况下,你实际上可以通过你的B提供公共函数来提供对x的“公共”访问。当然,在真正的编程中它受到保护是有原因的,你不想给所有东西完全访问,但你可以。