A a = new B() 正确 A a = new A() 正确 B b = new B() 正确 B b = new A() 不正确,即使加强制转换,也会出错。 但是C#,我不明白virual 和override ,C++应该virual就应该可以实现多态的情况,虽然调用的是父类,缺执行的是子类的代码。 有人能帮我分析,我上面的四个表达式是否正确,和virual 和override的作用么?特别是override么?
Class A { public abstract void method1();//存在抽象方法,ClassA不能直接实例化,抽象方法不需要函数体 public virtual void method2(){} public void method3(){}//无修饰符 }Class B:A { public override void method1(){}; public override void method2(){}; public new void method3(){}; }B b = new Class B(); A a = b; a.method1();//调用Class B的方法 b.method1();//调用Class B的方法a.method2();//调用Class B的方法 b.method2();//调用Class B的方法a.method3();//调用Class A的方法 b.method3();//调用Class B的方法
public abstract class A { public abstract void method1();//存在抽象方法,Class A不能直接实例化,Class 必须定义为抽象类,抽象方法不需要定义函数体 public virtual void method2(){ } public void method3(){ } } public class B:A { public override void method1(){} public override void method2(){} public void method3(){} } B b = new B(); A a = b; a.method1();//调用Class B的方法 b.method1();//调用Class B的方法 a.method2();//调用Class B的方法 b.method2();//调用Class B的方法 a.method3();//调用Class A的方法 b.method3();//调用Class B的方法
A a = new B() 正确 A a = new A() 正确 B b = new B() 正确 B b = new A() 不正确,即使加强制转换,也会出错。 但是C#,我不明白virual 和override ,C++应该virual就应该可以实现多态的情况,虽然调用的是父类,缺执行的是子类的代码。 有人能帮我分析,我上面的四个表达式是否正确,和virual 和override的作用么?特别是override么?
那我的问题来了: 那多态的时候,就是用子类去重新父类方法,这样还需要加virtual 和 override 么?
加virtual 和 override 不是不执行父类的方法,而用子类去替换么?
关键看来定义的类型,这里是A类型,当然实例化A了
子类A 父类B
A a = new B() 正确
A a = new A() 正确
B b = new B() 正确
B b = new A() 不正确,即使加强制转换,也会出错。
但是C#,我不明白virual 和override ,C++应该virual就应该可以实现多态的情况,虽然调用的是父类,缺执行的是子类的代码。 有人能帮我分析,我上面的四个表达式是否正确,和virual 和override的作用么?特别是override么?
{
public abstract void method1();//存在抽象方法,ClassA不能直接实例化,抽象方法不需要函数体
public virtual void method2(){}
public void method3(){}//无修饰符
}Class B:A
{
public override void method1(){};
public override void method2(){};
public new void method3(){};
}B b = new Class B();
A a = b;
a.method1();//调用Class B的方法
b.method1();//调用Class B的方法a.method2();//调用Class B的方法
b.method2();//调用Class B的方法a.method3();//调用Class A的方法
b.method3();//调用Class B的方法
public abstract class A
{
public abstract void method1();//存在抽象方法,Class A不能直接实例化,Class 必须定义为抽象类,抽象方法不需要定义函数体 public virtual void method2(){ } public void method3(){ }
} public class B:A
{
public override void method1(){}
public override void method2(){}
public void method3(){}
} B b = new B();
A a = b; a.method1();//调用Class B的方法
b.method1();//调用Class B的方法 a.method2();//调用Class B的方法
b.method2();//调用Class B的方法 a.method3();//调用Class A的方法
b.method3();//调用Class B的方法
子类A 父类B
A a = new B() 正确
A a = new A() 正确
B b = new B() 正确
B b = new A() 不正确,即使加强制转换,也会出错。
但是C#,我不明白virual 和override ,C++应该virual就应该可以实现多态的情况,虽然调用的是父类,缺执行的是子类的代码。 有人能帮我分析,我上面的四个表达式是否正确,和virual 和override的作用么?特别是override么?
但是还没有使我弄明白。
我只想知道 virual override 特别市override
我的理解是
virual 显示说明这个类成员是虚方法,一般子类中可以重写他,不一定非要重写
override 重写类成员,原成员在基类中必须含有关键字 virual(虚) abstract(抽象) override(被重写)
这个修饰符是最常用的,无论引用类型是子类还是基类,都只调用子类方法,就是多态new 使用他重写的方法,会根据实际调用的类来调用方法,引用子类类型,则执行子类重写的方法,基类类型则调用未被重写的那个方法abstract 抽象方法,必须在子类中重写,也必须在抽象类中定义
virual abstract override new 这些修饰符是互斥的,也有级别关系
一般最原始的类成员才会出现 virual abstract
最终的实现方法一般是override new 重写 不能更改方法的可访问性,参数,返回类型