September 14, 2003
Is there a chance this could ever work?

class A {}
class B:A {}

class C {
    A component;
    A getComponent() { return component; }
}

class D:C {
    B component;
}

void main() {
    B b=new B;
    D d=new D;
    d.component=b; // 1
    printf("%.*s\n",d.getComponent().classinfo.name); // 2
}

Put like this, I get an access violation in 2. If I change 1 to d.C.component=b; then it works fine. But I don't want nor that neither to override getComponent for each derivation of C.

-------------------------
Carlos Santander


---

Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.516 / Virus Database: 313 - Release Date: 2003-09-01


September 14, 2003
Carlos Santander B. wrote:
> Is there a chance this could ever work?
> 
> class A {}
> class B:A {}
> 
> class C {
>     A component;
>     A getComponent() { return component; }
> }
> 
> class D:C {
>     B component;
> }
> 
> void main() {
>     B b=new B;
>     D d=new D;
>     d.component=b; // 1
>     printf("%.*s\n",d.getComponent().classinfo.name); // 2
> }
> 
> Put like this, I get an access violation in 2. If I change 1 to
> d.C.component=b; then it works fine. But I don't want nor that neither to
> override getComponent for each derivation of C.

you will do the layout of D is
D{
	C{
		B{
			A{
			// a has no members
			}
		
		// B has no members
		}
	A component; // visible to C.getComponent
	}
B companent; // new member (not change if the type of C.component;
it is this item that d.component refers to
}

allowing D to redefine the class of `component` would require a `write barrier` in C to stop the following occuring

void func( C c, A a ) { c.componant = a; }

D d; func( d, new A() ); // would attempt to write an A to a B!


you can do ....

class C {
	private A comp;
	public void setComp( A c ) { comp = c; }
	public A getComp() { return comp; }
}

class D:C {
	public void setComp( A c )
	in {
		if ( c !== null ) {
			B b = cast(B)c
			assert( b );
		}
	}
	body {
		super.setComp( c );
	}
	public B getComp() { return cast(B)super.getComp(); }
}