C# C语言中调用父虚函数的原因#
我有以下代码。有人能回答为什么在这种情况下调用的是base-show方法而不是派生-show方法吗。在这种情况下,如何为派生类和基类的show函数分配内存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
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)