子类可以继承构造函数吗?

时间:2009-06-25 03:33:55

标签: .net vb.net oop

  1. 我有一个基类,“B”,它有 两个构造函数,一个没有 参数和其他 接受一个参数,一个整数
  2. 我有一个子类,“S”,其中 继承自“B”而不是 在其中定义任何构造函数。
  3. 我创建了S的实例, 试图传递给 构造函数一个整数。
  4. 我收到错误:

    Error 1 Too many arguments to 'Public Sub New()

    这让我感到惊讶,因为我认为如果没有在子类S中定义构造函数,那么基类构造函数方法,特别是具有单个整数参数的构造函数将被调用而没有错误。

    你知道我为什么会收到这个错误吗?构造函数是一个特例吗?

8 个答案:

答案 0 :(得分:6)

类的构造函数仅适用于它定义的类,即使在继承关系中也是如此。为了能够利用你的基类1-arg构造函数,你必须做这样的事情(在C#中):

public class S : B
{
    public S()
    {
        // do something for S
    }

    public S(int myInt) : base(myInt)
    {
        // do something for S
    }
}

答案 1 :(得分:6)

正如您所怀疑的那样,构造函数不是继承的。子类需要实现自己的构造函数。原因是基类的构造函数不知道如何初始化子类的成员,因此调用它们会使子类对象处于错误状态。

答案 2 :(得分:2)

看起来你正在使用VB。在这种情况下,您需要从子类的构造函数中显式调用适当的基类构造函数。

  

派生类的实例是   创建,Sub New的构造函数   基类首先执行,   其次是派生的构造函数   类。   Link to page

它调用无参数基类构造函数,但是发送一个整数,因为你不是显式地调用从派生类构造函数接受整数的基类构造函数。

答案 3 :(得分:1)

没有。这是一个不正确的假设。

如果您没有定义构造函数,则添加无参数构造函数。

答案 4 :(得分:1)

这是因为对于任何类,如果没有定义构造函数,编译器会认为存在默认的无参数构造函数。此外,您将无法设置任何私有基类成员,除非在派生类中显式调用基类构造函数。

这是C#代码。 VB应该是类似的。

class B
    {
        protected int aInt;
        private int bInt;
        public B()
        { }

        public B(int myInt)
        {
            aInt = myInt;
        }
    }

    class S : B
    {
        public S(int aInt, int bInt)
            : base(bInt)
        {
            base.aInt = aInt;
        }
    }

答案 5 :(得分:0)

如果未显式向类中添加构造函数,则默认情况下它具有无参数的空构造函数。我认为这回答了你的问题:)

答案 6 :(得分:0)

通常,基类的构造函数不是公共的。相反,它通常从子类的构造函数调用。

所有类都有一个构造函数,无论您是否定义它们。在您的情况下,我怀疑您对子类的构造函数的调用失败,因为子类中没有定义带有一个参数的构造函数。

答案 7 :(得分:0)

构造函数中的第一个语句必须是mybase.New。原因是所有类都继承自Object类,构造函数必须调用其基类的构造函数。