【发布时间】:2020-10-16 13:27:19
【问题描述】:
正如我们所知,private 成员在派生类中是不可访问的(不仅仅是私有的),而 public 和 protected 在派生类中可以直接访问。
- 如果一个类将另一个类声明为
friend,那么后者就可以完全访问第一个类的成员。
这是一个我试图理解但徒劳无功的例子:
class A
{
public:
int pub;
private:
int priv;
protected:
int prot;
friend class D;
};
class B : public A // public inheritance
{
int b = 0;
};
class C : private A
{
int c = 0;
};
class D
{
public:
void foo(B);
void bar(C);
};
void D::foo(B b)
{
b.pub = 0;
b.prot = 0;
b.priv = 0; // why this works? although A::priv is inaccessible in derived classes because it is private in base class?
// b.b = 0; // error. ok because b is private
}
void D::bar(C c)
{
// c.pub = 0; // error ok
// c.prot = 0; // error ok
// c.priv = 0; // error ok
// c.c = 0; // error. ok because c is private
}
- 问题:尽管我们知道
private在派生类中是不可访问的,为什么D::foo可以通过来自publicly 的对象访问A的私有成员,该对象继承自BaseA?那么为什么b.priv = 0;有效呢?我们知道friendship既不传递也不继承?
【问题讨论】:
-
“我们知道友谊既不是传递的也不是继承的?” - 你的例子没有违反这一点。只有
A部分被访问。 -
@StoryTeller-UnslanderMonica:但是为什么 D 的成员函数中的 B 实例甚至可以访问 A 的私有成员,而 C 的实例不能?我想这与继承类型有关。你可以解释吗?谢谢!
标签: c++ inheritance friend access-specifier