C#继承的隐藏方法
在虚方法中我们提到过,如果基类中的某些方法满足不了派生类的需求的时候可以通过重写基类虚方法来重新定义方法。除了这种方法外其实还可以采用隐藏方法来实现。如下:
namespace test
{
class Parent
{
public void printf() //基类中的方法
{
Console.WriteLine("这个是Parent类中的方法printf");
}
public virtual void Hello() //基类中的虚方法
{
Console.WriteLine("这个是Parent类中的虚方法Hello");
}
}
class Son:Parent
{
new public void printf() //显示隐藏基类汇总的函数,也可省略new这时就是隐式。
{
Console.WriteLine("这个是Son类中的方法printf");
}
public override void Hello()
{
Console.WriteLine("这个是Son类中重写的方法Hello");
}
}
class Program
{
static void Main(string[] args)
{
Son mySon = new Son();
mySon.printf();
mySon.Hello();
Parent myParent = new Parent();
myParent.printf();
myParent.Hello();
Console.Read();
}
}
}
/*
输出的结果为:
这个是Son类中的方法printf
这个是Son类中重写的方法Hello
这个是Parent类中的方法printf
这个是Parent类中的虚方法Hello
*/
从上处的结果来看好像虚方法和隐藏方法本质上好像是一样的。但是他们有一个区别。上述的的Main方法修改如下:
class Program
{
static void Main(string[] args)
{
Son mySon = new Son();
mySon.printf();
mySon.Hello();
Parent myParent = new Parent();
myParent.printf();
myParent.Hello();
myParent = mySon; //将派生类的引用赋值给基类
myParent.printf();
myParent.Hello();
Console.Read();
}
}
/*结果如下:
这个是Son类中的方法printf
这个是Son类中重写的方法Hello
这个是Parent类中的方法printf
这个是Parent类中的虚方法Hello
这个是Parent类中的方法printf
==这个是Son类中重写的方法Hello==
*/
由上面的结果我们可以看出来虚方法和隐藏式存在一定的区别的。区别如下:
编译器在分配内存时,
如果对象中有方法被重写了,则会按照重写的方法为准而忽略虚方法的分配内存。
如果有方法被隐藏了,则会将隐藏和被隐藏的函数都算在内的分配内存