class A
{
public virtual void showinfo()//虚方法
{
Console.WriteLine("A1");
}
public void show()
{
Console.WriteLine("A2");
} }
class B : A
{ public override void showinfo()//重新重载虚方法
{
Console.WriteLine("B1");
} public new void show()
{ Console.WriteLine("B2");
}
}上面的是声明的两个类
为什么在
Main中
要这样实现才可以看到虚方法的特性呢 B b = new B();
A a = b;///这一句是我不懂的,为什么会这样? 请高手 大虾们解释一下 谢谢!!
a.showinfo();
b.showinfo();
a.show();
b.show();
{
public virtual void showinfo()//虚方法
{
Console.WriteLine("A1");
}
public void show()
{
Console.WriteLine("A2");
} }
class B : A
{ public override void showinfo()//重新重载虚方法
{
Console.WriteLine("B1");
} public new void show()
{ Console.WriteLine("B2");
}
}上面的是声明的两个类
为什么在
Main中
要这样实现才可以看到虚方法的特性呢 B b = new B();
A a = b;///这一句是我不懂的,为什么会这样? 请高手 大虾们解释一下 谢谢!!
a.showinfo();
b.showinfo();
a.show();
b.show();
定义了一个变量a,它的类型是A,但是实际上在内存里保存的是一个B类型的对象b
因为B是从A继承来的,所以这样做是可以的。对于编译时绑定的函数,会调用A里面定义的函数,因为对编译器来说它是A类型
对于运行时绑定的函数,会调用B里面定义的函数,因为实际上它是一个B对象
该方法在类或结构的内部声明。它必须为静态方法,而不应为公共方法
它可以具有 void 或 int 返回类型。
声明 Main 方法时既可以使用参数,也可以不使用参数。
定义一个A对象,指向b地址.
将对象B的实例赋给A对象的实例a,因为B从A继承而来,所以可以这样写。
Main是程序的入口,程序的执行从这里开始!
你可以写多个 Main() 函数, 指定使用哪个作为入口点.默认的, 假定的, 并不是必需的.
派生类的对象赋值给基类的指针,可以用基类的指针调用派生类中override的函数;
下面简单总结一下:假设A是父类, B是子类,
如果使用时, 定义与实例时所用类相同, 即父类用父类实例化, 子类用子类实例化,
如A a = new A;
B b = new B;
虚方法是一点用处也没有, 只有当定义用父类, 实例化时用子类, 虚方法才有作用
即A a = new B;(还有一种情况就是定义用子类, 实例化用父类,即B b = new A; 这是错误的, 平时根本不可能用)这就是为什么楼主所举例子里, 一定要用A a = b;
不仅这个例子如此, 所有讲虚方法的例子里都是这样--定义用父类, 实例化用子类,只有在这种情况下, 虚方法才有意义, 其它任何情况, 虚方法都用不上
B1
B1
A2
B2
A a = b;///这一句是
这样理解
B b=new B();
A a = b//A的对象a指向b实例调用的时候就是B的方法
B1
B1
A2
B2
B b = new B(); //创建一个B类的对象
A a = b;//隐式转换,当在用到父类的时候用子类代替可以,当要用到子类的时候用父类代替则不行。当想把父类转成子类时,必须要显示转换.
a.showinfo(); //由于子类是重写父类方法,所以它以后调用的就是重写后的方法
b.showinfo();
a.show();
b.show();这个例子主要功能之一就是可以反映出new关键字,和使用virtual和override的组合之间的区别。
如果子类从写了父类的方法,以后就算子类转换成父类了,但是它所执行的永远是重写后的方法。
而使用new关键字,只是覆盖原方法。此时如果把子类转换成父类,那么父类执行的就是自己的方法了。
而不是子类用来覆盖父类的方法。慢慢体会。