Derived class 不调用 base class 方法
Derived class does not call base class method
class MyBaseClass
{
virtual public void Print()
{
Console.WriteLine("This is the base class.");
}
}
class MyDerivedClass : MyBaseClass
{
override public void Print()
{
Console.WriteLine("This is the derived class.");
}
}
class Program
{
static void Main()
{
MyDerivedClass derived = new MyDerivedClass();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();
}
}
输出:
This is the derived class.
This is the derived class.
我不明白为什么第二次调用打印派生的 class 的 print() 方法,因为我将 mybc 对象转换为基础 class。我希望它改为打印 base class 打印方法。我在这里遗漏了什么吗?
重写虚方法的全部意义在于调用对象的底层(运行时)类型的版本,而不是静态(编译时)类型的版本——即使您通过声明为基础的类型 class.
所以这完全符合预期。
如果不是这种情况,class 层次结构的许多实用程序将变得无用,因为您无法更改传递给方法的 class 类型的行为通过传递给它一个自定义派生 class.
你已经覆盖了它。它只调用派生方法。您必须明确 call the base class' method:
override public void Print() {
base.Print();
Console.WriteLine("This is the derived class.");
}
变量类型和实例类型是两种不同的类型。转换不会更改实例类型。
当您将方法声明为 virtual/abstract 时,您是在说您想要
调用时确定行为的实例类型。
另请注意,此赋值是有效的 - 无需转换语法即可将变量类型从子类更改为基类。这种转换可以隐式完成。
MyBaseClass mybc = derived;
class MyBaseClass
{
virtual public void Print()
{
Console.WriteLine("This is the base class.");
}
}
class MyDerivedClass : MyBaseClass
{
override public void Print()
{
Console.WriteLine("This is the derived class.");
}
}
class Program
{
static void Main()
{
MyDerivedClass derived = new MyDerivedClass();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();
}
}
输出:
This is the derived class.
This is the derived class.
我不明白为什么第二次调用打印派生的 class 的 print() 方法,因为我将 mybc 对象转换为基础 class。我希望它改为打印 base class 打印方法。我在这里遗漏了什么吗?
重写虚方法的全部意义在于调用对象的底层(运行时)类型的版本,而不是静态(编译时)类型的版本——即使您通过声明为基础的类型 class.
所以这完全符合预期。
如果不是这种情况,class 层次结构的许多实用程序将变得无用,因为您无法更改传递给方法的 class 类型的行为通过传递给它一个自定义派生 class.
你已经覆盖了它。它只调用派生方法。您必须明确 call the base class' method:
override public void Print() {
base.Print();
Console.WriteLine("This is the derived class.");
}
变量类型和实例类型是两种不同的类型。转换不会更改实例类型。
当您将方法声明为 virtual/abstract 时,您是在说您想要 调用时确定行为的实例类型。
另请注意,此赋值是有效的 - 无需转换语法即可将变量类型从子类更改为基类。这种转换可以隐式完成。
MyBaseClass mybc = derived;