在基类中使用virtual,通过派生类实例给基类去调用方法时,override的添加前后结果为什么都是一样;
class Person
{
public virtual void Log()
{
Debug.LogError("Person");
}
}
class Man: Person
{
public void Log()
{
Debug.LogError("Man");
}
}
class Program
{
static void Main(string[] args)
{
Person person = new Man();
person.Log();
// Output is Man
}
}
假设你把雪碧瓶子里倒满可乐
也就是:
可乐:雪碧
{
ovride 倒出(){
}
}
你觉着 现在
雪碧 雪碧=new 可乐()
倒出的到底是雪碧还是可乐。
所以我们有个简单理解,这个东西叫偷梁换柱,无论名义上你是否转换成父类了,但是里面的东西已经被换掉了。
然后你的代码其实没有ovride,那么他其实是new
class Man: Person
{
public new void Log() //虽然你代码没写new,但是他的默认就是new
{
Debug.LogError("Man");
}
}
new呢其实没改本质的内容,只是改了名义上的指代,换成中国话就是“指鹿为马”,不过是指鹿为马有上下文。当他还在man的范围里,他叫马。
回到penson的上下文,他依旧叫鹿。
所以你这里还是显示Person
因为你没使用override关键字呀
你代码不报警告吗
参考GPT和自己的思路:
在你提供的代码中,Man类中的Log方法没有使用override关键字,因此它不是对基类Person中的Log方法的重写,而是一个新的方法。因此,当你将Man类的实例赋给Person类的引用变量并调用其Log方法时,因为Man类中有一个与Person类中定义的Log方法名相同、参数列表相同的方法,所以会调用Man类中的Log方法。如果你想要重写基类中的Log方法,应该在子类中使用override关键字,并且方法签名必须与基类中的方法签名完全匹配,包括方法名称,参数列表以及返回类型。这样你就可以通过基类实例或子类实例来调用该方法并根据实际的对象类型选择使用哪个方法。