digitalmars.D.learn - No implicitly convert derived ptr to base ptr?
- Nick Sabalausky (10/10) Apr 24 2012 The compiler rejects this:
- Jonathan M Davis (6/20) Apr 24 2012 Well, given that pointers aren't polymorphic at all, it's not all that g...
- Timon Gehr (15/25) Apr 24 2012 Yes it is. It was allowed a number of releases ago, but that bug has
The compiler rejects this: class Base {} class Derived : Base {} void main() { Base* basePtr; Derived* derivedPtr; basePtr = derivedPtr; // ERROR } Is that really correct that it shouldn't be allowed?
Apr 24 2012
On Wednesday, April 25, 2012 01:50:51 Nick Sabalausky wrote:The compiler rejects this: class Base {} class Derived : Base {} void main() { Base* basePtr; Derived* derivedPtr; basePtr = derivedPtr; // ERROR } Is that really correct that it shouldn't be allowed?Well, given that pointers aren't polymorphic at all, it's not all that great an idea in general to assign a derived class object to a base class pointer, so it's arguably a good thing that it doesn't work, but I am a bit surprised that it doesn't work. - Jonathan M Davis
Apr 24 2012
On 04/25/2012 07:50 AM, Nick Sabalausky wrote:The compiler rejects this: class Base {} class Derived : Base {} void main() { Base* basePtr; Derived* derivedPtr; basePtr = derivedPtr; // ERROR } Is that really correct that it shouldn't be allowed?Yes it is. It was allowed a number of releases ago, but that bug has since been fixed. Example that shows unsoundness: class Base {} class Derived1 : Base {} class Derived2 : Base {} void main() { Derived1 d1; Base* basePtr = &d1; *basePtr = new Derived2; assert(typeid(d1)==typeid(Derived2) && !is(Derived2: typeof(d1)); } Note that the conversion succeeds if the tail of the pointer is not mutable, eg Derived* implicitly converts to const(Base)*.
Apr 24 2012