C# C语言中调用父虚函数的原因#

C# C语言中调用父虚函数的原因#,c#,oop,C#,Oop,我有以下代码。有人能回答为什么在这种情况下调用的是base-show方法而不是派生-show方法吗。在这种情况下,如何为派生类和基类的show函数分配内存 class OverrideAndNew : Derive { public static void Main() { Derive obj = new Derive1(); obj.Show(); Console.ReadLine(); } } class Bas

我有以下代码。有人能回答为什么在这种情况下调用的是base-show方法而不是派生-show方法吗。在这种情况下,如何为派生类和基类的show函数分配内存

class OverrideAndNew : Derive
{

    public static void Main()
    {
        Derive obj = new Derive1();
        obj.Show();

        Console.ReadLine();
    }
}

class Base
{
    public virtual void Show()
    {
        Console.WriteLine("Base - Show");
    }
}

class Derive : Base
{
    protected virtual void Show()
    {
        Console.WriteLine("Derive - Show");
    }
}

class Derive1 : Derive
{
    protected override void Show()
    {
        Console.WriteLine("Derive1 - Show");
    }
}

因为你叫它。重写方法时不能修改访问修饰符。所以基本上,Derive1超越了Derive的Show方法。但派生永远不会超过基础的派生。因此,只有一个publicshow方法,即在Base中实现的方法

你可能想做的是:

class OverrideAndNew
{
    public static void Main()
    {
        Derive obj = new Derive1();
        obj.Show();

        Console.ReadLine();
    }
}

class Base
{
    public virtual void Show()
    {
        Console.WriteLine("Base - Show");
    }
}

class Derive : Base
{
    public override void Show()
    {
        Console.WriteLine("Derive - Show");
    }
}

class Derive1 : Derive
{
    public override void Show()
    {
        Console.WriteLine("Derive1 - Show");
    }
}

请注意,方法签名保持不变。它总是公开的,因为基地说它必须公开。它总是相同的名称、返回类型和参数(本例中没有)。因为您调用了它。重写方法时不能修改访问修饰符。所以基本上,Derive1超越了Derive的Show方法。但派生永远不会超过基础的派生。因此,只有一个publicshow方法,即在Base中实现的方法

你可能想做的是:

class OverrideAndNew
{
    public static void Main()
    {
        Derive obj = new Derive1();
        obj.Show();

        Console.ReadLine();
    }
}

class Base
{
    public virtual void Show()
    {
        Console.WriteLine("Base - Show");
    }
}

class Derive : Base
{
    public override void Show()
    {
        Console.WriteLine("Derive - Show");
    }
}

class Derive1 : Derive
{
    public override void Show()
    {
        Console.WriteLine("Derive1 - Show");
    }
}

请注意,方法签名保持不变。它总是公开的,因为基地说它必须公开。它始终具有相同的名称、返回类型和参数(在本例中为无)。

您的受保护方法没有覆盖
基。Show
,它只是将其隐藏。您需要使用相同的访问修饰符(即public)在
derivate
中声明
Show
,并使用
override
关键字明确声明您要重写该方法

请注意,此程序生成的编译器警告如下:

“派生.Show()”隐藏继承的成员“Base.Show()”。要使当前成员覆盖该实现,请添加override关键字。否则,添加新关键字


另一个问题是,为什么这只是一个警告而不是一个错误。这是因为C#是为了最小化所谓的脆弱基类问题而设计的。如果
Base
在一个程序集中,而
derivate
在另一个程序集中(可能由不同的团队甚至不同的公司生产),那么从
derivate
的作者的角度来看,如果
Base
的版本2添加了一个新方法
Show
,打破了
derivate
中现有的代码,这将是不可取的。因此,它只是一个警告,而不是一个错误。

您的受保护方法并没有覆盖
Base.Show
,它只是在隐藏它。您需要使用相同的访问修饰符(即public)在
derivate
中声明
Show
,并使用
override
关键字明确声明您要重写该方法

请注意,此程序生成的编译器警告如下:

“派生.Show()”隐藏继承的成员“Base.Show()”。要使当前成员覆盖该实现,请添加override关键字。否则,添加新关键字


另一个问题是,为什么这只是一个警告而不是一个错误。这是因为C#是为了最小化所谓的脆弱基类问题而设计的。如果
Base
在一个程序集中,而
derivate
在另一个程序集中(可能由不同的团队甚至不同的公司生产),那么从
derivate
的作者的角度来看,如果
Base
的版本2添加了一个新方法
Show
,打破了
derivate
中现有的代码,这将是不可取的。因此,这只是一个警告,而不是一个错误。

仅在nvoigt的MSDN文档中关于受保护修饰符的回答中添加“受保护关键字是一个成员访问修饰符。受保护成员可以在其类内和通过派生类实例访问。”。因此,通过调用访问公共方法(即Base)的对象上的方法,只需将“受保护的关键字是成员访问修饰符。受保护的成员可在其类内和派生类实例中访问”添加到nvoigt在MSDN文档中关于受保护修饰符的回答中。因此,通过调用对象上的方法,可以访问公共方法(即Base)