www.digitalmars.com         C & C++   DMDScript  

D - covariance in data members

reply "Carlos Santander B." <carlos8294 msn.com> writes:
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
Sep 13 2003
parent Mike Wynn <mike l8night.co.uk> writes:
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(); } }
Sep 13 2003