-4

我知道在 c++ 中,继承是“公共”或“私有”或“受保护”,这意味着如果我将 A 类公开继承到 B 类,如下所示

    class A
{
    public int pub1;
    private int prvt1;
    protected int proc1;
}


class B : public A
{

    //public int pub1;//This variable is because of inheritacne and is internal.
    //public int proc1;//This variable is because of inheritacne and is internal.
    public int pub2;
    private int prvt2;
    protected int pro2;
}

即A类的两个变量(pub1,proc1)被继承但访问说明符是公共的。但在C#中如下

    class A
{
    public int pub1;
    private int prvt1;
    protected int proc1;
}


class B : A
{

    //public int pub1; //This variable is because of inheritacne and is internal.
    //protected int proc1;//This variable is because of inheritacne and is internal.
    public int pub2;
    private int prvt2;
    protected int pro2;
}

即 A 类的两个变量 (pub1, proc1) 被继承,但访问说明符与 A 类中的相同。

为什么在.NET 框架中给出这种实现。这有什么优点和缺点?

4

2 回答 2

1

这个答案仅与 C# 有关。

在 C# 中,只有一个“级别”的继承,那就是一种“公共”继承。您的班级A可以有五种不同的可访问性的成员,即:

class A
{
    public int pub1;
    private int prvt1;    // "private" keyword can be left out
    protected int proc1;
    internal int intnl1;
    protected internal int protintnl1;
}

当一个publicorprotected成员被继承时,它在派生类中仍然具有完全相同的可访问性。当一个private成员被继承时,它不能从派生类访问,所以在某种意义上它是超级私有的。同样,当一个成员被另一个程序集中internal的类型继承时,内部成员对派生类变得不可见。

因此,当一个protected internal成员由另一个程序集中的类派生时,它就变成了有效protected的。当成员被覆盖时,可以看到这一点。考虑这个例子:

public class Ax
{
    protected internal virtual void Method()
    {
    }
}

然后在另一个程序集中:

// Bx is in another assembly than Ax
class Bx : Ax
{
    protected override void Method()
    {
    }
}

请注意,Method已有效地变为protected新程序集内部。

在 astruct中,不允许声明新protected(或protected internal)成员,因为在 C# 中结构是密封的,因此引入protected成员是没有意义的。(有一种protected方法,MemberwiseClone()结构从它们的基类继承。)

同样,一个static类不能声明新的protected(或protected internal)成员。一个sealed类可能继承许多protected成员,override其中一些成员,但它会发出编译器警告,要求protected在类中引入新成员sealed

于 2013-03-26T07:21:18.070 回答
1

也许这是一条评论,但它太大而无法放入评论区。

我拿走了你的课程定义并尝试了这个 -

class A
{
    public:
    int pub1;
    private:
    int prvt1;
    protected:
    int proc1;
};


class B : public A
{

    //public int pub1;//This variable is because of inheritacne and is internal.
    //public int proc1;//This variable is because of inheritacne and is internal.
    public:
    int pub2;
    private:
    int prvt2;
    protected:
    int pro2;
};

int main()
{
    B* b = new B();
    b->pub2 = 1;
    b->proc1 = 2;
}

编译器冲我咆哮——

prog.cpp: In function ‘int main()’:
prog.cpp:8:9: error: ‘int A::proc1’ is protected
prog.cpp:29:8: error: within this context

我猜 C++ 不会将受保护的成员转换为公共的。还是我从问题中遗漏了什么?

于 2013-03-26T06:20:33.367 回答