黑马程序员技术交流社区
标题:
继承的小问题
[打印本页]
作者:
郑丹丹1990
时间:
2013-5-17 08:18
标题:
继承的小问题
本帖最后由 郑丹丹1990 于 2013-5-17 08:24 编辑
namespace 继承
{
class Program
{
static void Main(string[] args)
{
son s = new son("xioaming", 23, 175);
Console.WriteLine(s.Height);
s.SayHello();
s.speak();
Father f = (Father)new son("tom", 40, 180);
f.speak();
Console.ReadKey();
}
}
public class Father
{
public string Name { get; set; }
public int Age { get; set; }
public double Height { get; set; }
public Father(string name,int age, double height)
{
this.Name=name;
this.Age=age;
this.Height=height;
}
public void SayHello()
{
Console.WriteLine("father.sayhello()");
}
public virtual void speak()
{
Console.WriteLine("father.virtual.speak()");
}
}
public class son:Father
{
public son(string name, int age, double height)
: base(name, age, height)
{
this.Name = name;
this.Age = age;
this.Height = height;
}
public override void speak()
{
Console.WriteLine("son.speak()");
}
}
}
复制代码
f.speak()是调用子类的方法??这是为什么呀?不是已经把Son强制转化为Father了吗?为何不调用基类中的方法?
另:若把son中的speak()方法的override换成new,则会调用父类方法。这又是为何??
作者:
小石头39910
时间:
2013-5-17 09:33
因为你的是子类继承父类,所以说子类的speak方法重写(覆盖)了父类的同名方法。还有就是子类是不可以强制转换为父类的,但是可以定义一个父类类型的引用指向一个子类的对象!换成new的话子类的speak方法就不会覆盖父类的speak方法了。
作者:
王朋
时间:
2013-5-18 08:39
当类中的方法声明前加上了virtual修饰符,该方法被称之为虚拟方法。对于虚拟方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法。题中由于father类中的speak方法在子类son中被重写,所以会调用子类中的speak方法。
作者:
郑丹丹1990
时间:
2013-5-19 07:28
王朋 发表于 2013-5-18 08:39
当类中的方法声明前加上了virtual修饰符,该方法被称之为虚拟方法。对于虚拟方法,它的执行方式可以被派生类 ...
:handshake学写了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2