digitalmars.D.bugs - [Bug 91] New: Inherited classes require base class to have a default constructor.
- d-bugmail puremagic.com (28/28) Apr 06 2006 http://d.puremagic.com/bugzilla/show_bug.cgi?id=91
- =?ISO-8859-1?Q?Jari-Matti_M=E4kel=E4?= (6/36) Apr 07 2006 This is correct behaviour. Class B implicitly calls the default
- d-bugmail puremagic.com (20/20) Apr 07 2006 http://d.puremagic.com/bugzilla/show_bug.cgi?id=91
- d-bugmail puremagic.com (6/6) Apr 07 2006 http://d.puremagic.com/bugzilla/show_bug.cgi?id=91
- d-bugmail puremagic.com (15/15) Apr 07 2006 http://d.puremagic.com/bugzilla/show_bug.cgi?id=91
http://d.puremagic.com/bugzilla/show_bug.cgi?id=91 Summary: Inherited classes require base class to have a default constructor. Product: D Version: 0.152 Platform: PC OS/Version: Windows Status: NEW Severity: minor Priority: P2 Component: DMD AssignedTo: bugzilla digitalmars.com ReportedBy: eric96 gmail.com Let me know if this is expected behavior or some rule I don't know about, but I think it's a bug. If you insert the default constructor "this(){}" in A, it compiles fine. // Looks like it requires the base class to have a default constructor. class A { this (int i) // constructor yage.a.this(int) does not match argument types () {} } class B : A { this (int i) {} } Also, Windows XP SP2; Haven't tried it on Linux yet. --
Apr 06 2006
d-bugmail puremagic.com wrote:http://d.puremagic.com/bugzilla/show_bug.cgi?id=91 Summary: Inherited classes require base class to have a default constructor. Product: D Version: 0.152 Platform: PC OS/Version: Windows Status: NEW Severity: minor Priority: P2 Component: DMD AssignedTo: bugzilla digitalmars.com ReportedBy: eric96 gmail.com Let me know if this is expected behavior or some rule I don't know about, but I think it's a bug. If you insert the default constructor "this(){}" in A, it compiles fine. // Looks like it requires the base class to have a default constructor. class A { this (int i) // constructor yage.a.this(int) does not match argument types () {} } class B : A { this (int i) {} }This is correct behaviour. Class B implicitly calls the default constructor and if one is not found, an appropriate parent class constructor call should be explicitly defined in B's constructor. -- Jari-Matti
Apr 07 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=91 smjg iname.com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |smjg iname.com Status|NEW |RESOLVED Resolution| |INVALID The compiler is correctly diagnosing an error. The derived class needs a base class constructor to call. The keyword "super", when used in a constructor, denotes a constructor of the base class. class B : A { this (int i) { super(i); } } If no call to super is present, then it looks for a default constructor and calls that. Hence if there's no default constructor in the base class, then you must call super when calling the derived class. --
Apr 07 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=91 I'm familiar with super(), but I incorrectly thought that I could completely override the constructor in the parent class, as it works with other methods. Is this behavior consistent with other oo languages? --
Apr 07 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=91 Yes, including C++ and Java. If anybody could circumvent the requirement to use a constructor simply by creating a derived a class, it would defeat the point. You can, however, put a protected constructor in the base class. This is a constructor created specifically for derived classes to base their constructors on. You would be able to completely override* a constructor if the base class has a protected constructor that does nothing. But can you think of an example in which this would make sense? * Actually, constructors don't override as such. A constructor is a member only of the class in which it is defined, not of any derived classes. Hence if the base class has no default constructor, then when deriving a class from it you must explicitly define a constructor. --
Apr 07 2006