我有一个简单的课程如下
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
。
编辑:我们可以访问的价值 A::x
使用B的对象?喜欢 obj.x
?
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
。
A::x
受到保护,因此无法从外部访问,也不能访问 A().x
要么 B().x
。然而,它可以通过以下方法获得 A
和那些直接继承它的人(因为受保护而非私人),例如 B
。所以,不管语义如何 B::sety()
可以访问它(如平原 x
或者作为 A::x
如果被阴影遮挡 B::x
或纯粹的冗长)。
你可以简单地称之为 x
在B班
例如:
class B : public A
{
public:
...
void setx(int d)
{
x=d;
}
};
请注意,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的“公共”访问。当然,在实际编程中它受到保护是有原因的,你不想给所有内容提供完全访问权限,但你可以。