访问继承的私有基类成员.通过派生类对象.在基类成员中创建

本文关键字:基类 成员 对象 创建 派生 继承 访问 | 更新日期: 2023-09-27 18:36:39

我无法理解为什么 a 类中的 m() 可以通过 b 类和 b 类对象访问 x 和 y,如果 x 和 y 是私有的。我知道当 b 从 a 继承时,b 从 a 接收私有成员,即使它们不能被 b 使用。但对我来说奇怪的是,b 成员不能使用 x 和 y,a 以外的类不能通过 b 类和 b 类对象获取变量,但 m() 可以通过 b 类和 b 类对象访问 x 和 y。

有人可以使用我错过的一般规则或解释编译器如何将基本成员"提供"给派生类来向我解释这一点吗?

class a
{
    private int x;
    private static int y;
    static void m()
    {
        b bobj = new b();
        int mm = bobj.x;
        int rr = b.y;

    }
    void n()
    {
        b bobj = new b();
        int mm = bobj.x;
        int rr = b.y;
    }
}
class b : a
{
    private int u;
    private static int v;
    static void o()
    {
    }
    void p()
    {
    }
}

访问继承的私有基类成员.通过派生类对象.在基类成员中创建

我无法理解为什么 a 类中的 m() 可以通过 b 类和 b 类对象访问 x 和 y 如果 x 和 y 是私有的

声明中的代码可以访问该类声明的任何私有成员 - 就这么简单。所以a中的代码无法访问在b声明的私有变量,但它可以通过a的实例访问a中声明的私有变量,而也恰好是b的实例。

请注意,此行:

int rr = b.y;

有效地转换为

int rr = a.y;

y仅由a声明 - 如果它真的b声明,它将无法访问。

有关更多详细信息,请参阅 C# 4 语言规范的第 3.5 节。

这是

从C++语言继承的规则。

privateprotected对类进行操作,而不是对对象进行操作。 因此,例如,如果你有一个Bank对象,它的成员可以访问任何其他Bank的私有数据,尽管这可能看起来违反直觉或危险。

由于C++广泛使用指针算术和无限类型转换,因此无法在同一进程中执行任何代码之前可靠地保护进程内的数据。

但是,如果您只需要对象级保护以防止意外访问,则可以通过定义接口和仅在银行之间传递接口来帮助。 虽然Bank对象仍然可以执行以下操作:

void TransferMoneyFrom(IBank otherBank, decimal theirAccountNumber,
                        decimal receivingAccountNumber, int amount)
{
    ((Bank)otherBank).PrivateProperty = whatever;
}

。它不太可能无意中发生,因为需要显式类型转换或使用反射。

(请注意,C# 通常可以更轻松地有意访问某个其他的私有成员,而您没有其源代码(按名称,使用反射)。 如果该类型的供应商认为这是一个缺点,他们可以使用混淆器来使这更加困难。 这仍然不能以任何方式保护模糊处理的对象免受其自身其他实例的影响。