访问派生类中的基类成员
Posted
技术标签:
【中文标题】访问派生类中的基类成员【英文标题】:Accessing a base class member in derived class 【发布时间】:2011-03-01 11:11:52 【问题描述】:我有一个简单的类如下
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();
如何在不创建class A
的实例的情况下从派生的class B
的实例设置protected
实例变量A::x
的值。
编辑:我们可以使用 B 的对象访问A::x
的值吗?喜欢obj.x
?
【问题讨论】:
访问它。它在 B 的成员函数中可见。 【参考方案1】: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
的实例一样访问A::x
,因为obj
隐含地是A
的实例。
【讨论】:
可能想提及范围以及它如何影响访问。【参考方案2】:A::x
受到保护,因此无法从外部访问,无论是 A().x
还是 B().x
。然而,它可以在A
和直接继承它的方法中访问(因为受保护,而不是私有),例如B
。因此,无论语义如何,B::sety()
都可以访问它(作为普通的 x
或 A::x
,以防被 B::x
遮蔽或纯粹冗长)。
【讨论】:
【参考方案3】:请注意,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 的“公共”访问权限,方法是使用公共功能来访问它。当然,在实际编程中,它受到保护是有原因的,你不想让所有东西都完全访问,但你可以。
【讨论】:
完全正确,但对于初学者,您应该将此与private:
的行为进行对比【参考方案4】:
您可以在 B 类中将其简称为 x
例如:
class B : public A
public:
...
void setx(int d)
x=d;
;
【讨论】:
以上是关于访问派生类中的基类成员的主要内容,如果未能解决你的问题,请参考以下文章