派生类的构造函数 与基类的调用关系

本文探讨了C#中基类构造函数如何被派生类构造函数调用的问题,介绍了base关键字的使用,并通过示例代码展示了不同情况下构造函数的调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基类的构造函数不能被继承,但可以在派生类中的构造函数调用,通过base()调用
 
看代码说问题吧。
    public class A
    {
        
public A(string
 a) { }
    }
    
public class
 B:A
    {
        
public
 B() { }
    }
这段代码编译后,会有个错误提示:A does not contain a constructor that takes '0' arguments ,中文意思类A没有包含无参构造函数。按照提示,我在类A中,添加了无参构造函数,问题解决了。那么为什么会这样呢,我们知道,子类在创建对象执行构造函数之前会先执行父类的构造函数,那么假如父类中有多个构造函数,又是执行哪个呢,这时候base这个关键字我想可以来说明一切。还是看代码吧:
    public class A
    {
        
public
 A() { }
        
public A(string
 a) { }
    }
    
public class
 B:A
    {
        
public B():base
()
        { }
    }
跟上面的代码差不多,我在A中添加了无参构造函数,然后在B中修改了这句:pubic B():base(){},然后我们测试下,创建一个B对象,在A类中的2个构造函数中设置断点,发现无参构造函数执行了,我想正是因为这个base在这里发挥了作用,是base()指向了父类的无参构造函数。其实,在类B中,我们完全可以省略 base(),也能正常运行,我想,这是系统默认指向了父类的无参构造函数的原因吧,所以也可以省略了,其实大多数时候,我们都是省略不写的。看到这里,我想你应该知道第一段代码中提示的错误的原因了吧,原因是A类中没有无参的构造函数,这样在执行B中的构造函数的时候,就没法执行A中的无参构造函数了。 下面我在写一段不使用无参构造函数的代码,看了会更加清晰:

    public class A
    {
        
public A(string
 a)
        {
            
//

        }
    }
    
public class
 B:A
    {
        
public B(string a):base
(a)
        {
            
//

        }
    }
B中的构造函数指定了调用父类的A(string a)构造函数。这样我们创建B对象在执行构造函数前就会执行父类中对应的指定的构造函数了。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值