让我们在C#中举个例子
public class Foo { public Foo() { } public Foo(int j) { } } public class Bar : Foo { }
现在,除了构造函数之外,Foo的所有公共成员都可以在Bar中访问.我做不了类似的事情
Bar bb = new Bar(1);
为什么构造函数不可继承?
UPDATE
我知道我们可以链接构造函数,但我想知道为什么上面的构造无效.我相信它应该是有正当理由的.
构造函数不可继承,因为它可能会导致奇怪和无意的行为.更具体地说,如果向基类添加了新的构造函数,则所有派生类都将获取该构造函数的实例.在某些情况下,这是一件坏事,因为您的基类可能指定了对派生类没有意义的参数.
一个常见的例子是,在许多语言中,所有对象的基类(通常称为"Object")都有一个没有参数的构造函数.如果继承构造函数,这意味着所有对象都有一个无参数构造函数,并且没有办法说"我希望制作此类实例的人提供参数X,Y和Z,否则他们的代码不应该编译. " 对于许多类,重要的是为其正确的函数定义某些参数,并使构造函数不可遗传是类作者可以保证始终定义某些参数的方式的一部分.
编辑以响应注释:Ramesh指出,如果构造函数是按照他们希望的那样继承的,那么他总是可以在每个派生类中使用私有声明的构造函数来覆盖基类构造函数.这当然是正确的,但这个策略存在后勤问题.它要求派生类的编写者必须密切关注基类,如果他们想要基类构造函数的块继承,则添加私有构造函数.这对于编写派生类的人来说不仅有很多工作,这种跨类的隐式依赖正是导致奇怪行为的那种东西.
Ramesh - 并不是你所描述的不可能添加到语言中.一般来说,它没有完成,因为这种行为可能会让人感到困惑并导致大量的额外调试和代码编写.
Quintin Robinson在评论中提供了一些非常有价值的回答,这些评论绝对值得一读.
它们是(通过链接),你必须在派生对象中链接构造函数.IE:
public class Foo { public Foo() { } public Foo(int j) { } } public class Bar : Foo { public Bar() : base() { } public Bar(int j) : base(j) { } }
然后,派生对象中的构造函数将链接调用基础对象中的构造函数.
如果您想进一步阅读,本文提供了一些更多示例.