首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

New关键字:为什么不调用派生方法?

基础概念

在面向对象编程中,new 关键字用于创建一个类的实例。当使用 new 关键字创建对象时,会调用基类的构造函数来初始化对象。然而,new 关键字并不会自动调用派生类(子类)的方法。

原因

  1. 构造函数调用顺序:在创建对象时,首先会调用基类的构造函数,然后才调用派生类的构造函数。如果在基类构造函数中调用了某个方法,而这个方法在派生类中被重写,那么调用的仍然是基类的方法,而不是派生类的方法。
  2. 静态绑定:在基类构造函数中调用的方法是通过静态绑定(编译时绑定)来确定的,而不是动态绑定(运行时绑定)。因此,即使派生类重写了该方法,调用的仍然是基类的版本。

解决方法

  1. 避免在基类构造函数中调用虚方法:如果基类构造函数中需要调用某个方法,并且这个方法可能在派生类中被重写,那么应该避免在基类构造函数中调用这个方法。可以将这个方法的调用移到派生类的构造函数中。
  2. 使用虚方法和动态绑定:确保在基类中将需要被派生类重写的方法声明为 virtual(虚方法),这样在运行时通过动态绑定来调用正确的方法版本。

示例代码

代码语言:txt
复制
using System;

public class BaseClass
{
    public BaseClass()
    {
        // 避免在基类构造函数中调用虚方法
        Console.WriteLine("BaseClass constructor");
    }

    public virtual void Display()
    {
        Console.WriteLine("BaseClass Display");
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass()
    {
        Console.WriteLine("DerivedClass constructor");
    }

    public override void Display()
    {
        Console.WriteLine("DerivedClass Display");
    }
}

public class Program
{
    public static void Main()
    {
        DerivedClass derived = new DerivedClass();
        derived.Display(); // 输出 "DerivedClass Display"
    }
}

参考链接

通过上述方法,可以确保在创建派生类对象时,正确调用派生类的方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券