2012-04-13 7 views
-1
struct BaseType 
{ 
    int x1; 
    float x2; 
}; 

struct ChildType 
{ 
    int y1; 
    float y2; 
}; 

Class Base  
{    
    BaseType obj;   

    void funcBase(BaseType **ptr) 
    { 

     *ptr = &obj;     // When this assignment happens ofcourse obj is of the BaseType as the LHS ptr is pointing to a BaseType            

    Now I want to write a C++ equivalent code of the following 2 algorithmic statements,          

     BaseType's obj.x1 = ChildTypes's obj.y1;      
     BaseType's obj.x2 = ChildTypes's.obj.y1;     


    }    
}; 

class Child :: public Base 
{ 
    ChildType obj; 

}; 

Ich möchte auf das Objekt obj.y1 von der Basis zugreifen und es der Basis obj.x1 zuweisen.Zugriff auf das Datenamember der untergeordneten Klasse, wenn sowohl die Basis- als auch die untergeordnete Klasse denselben Objektnamen, aber unterschiedliche Typen haben. in C++

Aber 1 ist daran zu denken, dass die Objektnamen in der Basis und Kind ist die gleiche „obj“.

Kann mir jemand freundlicherweise dabei helfen. Vielen Dank.

+0

Seans Antwort scheint eine gute Übereinstimmung für Ihre Frage zu sein (vorausgesetzt, dass seine Interpretation Ihrer Frage die richtige ist), aber es ist nicht klar, was Sie fragen. Warum versuchen Sie, auf ein Datenelement eines Child-Objekts von einer Elementfunktion eines Base-Objekts zuzugreifen? Eine Beschreibung Ihres Gesamtziels (oder Codebeispiels, das es demonstriert) wäre hilfreich. – JBentley

+2

Was ist dein Endziel? Wie Alex Z gesagt hat, ist es möglich, aber ich empfehle es nicht besonders. Die Basisklasse sollte nicht über ihre Kindklasse wissen müssen. Diese Art von Schritten der Zehen der Vererbung. Was passiert, wenn obj tatsächlich ein BaseType ist und Sie versuchen, es wie einen ChildType zu behandeln? Schlechte, schlechte Dinge. – Corbin

+1

In der Tat ein anderes Design ist wahrscheinlich der Weg, hier zu gehen .. –

Antwort

2

Ihre Frage ist etwas vage, aber von dem, was ich sammeln kann, wollen Sie etwas wie folgt aus:

ChildType* child = dynamic_cast<ChildType*>(&obj); 

Jetzt wird child auf obj zeigt, als ob sie vom Typ waren ChildType, unter der Annahme, die Besetzung erfolgreich . Lesen

mehr über here.

EDIT typecasting: sollte ich erwähnen, dass nur eine Schublade gesteckt wie dies vermieden werden sollte, wenn ein besseres Design sie ersetzen können. Vielleicht sollten Sie Ihren Gesamtentwurf für einen Moment hier überdenken.

EDIT2: Ihre letzte Bearbeitung gegeben, hier ist ein spezifischeres Block von Beispielcode:

ChildType* child = dynamic_cast<ChildType*>(&obj); 
obj.x1 = child->y1; 
obj.x2 = child->y2; 
+0

Ich habe meine Antwort mit einem anderen Beispiel bearbeitet, das auf Ihre letzte Änderung zugeschnitten ist. –

1

ich denken, Sie haben ein Objekt vom Typ Kind, das nicht funcBase nicht implementiert() und dass Sie möchte funcBase() für dieses Objekt aufrufen und funcBase() Zugriff auf Child :: obj und nicht Base :: obj haben. Wenn das der Fall ist, dann Ich glaube Sie Kind als

class Child : virtual public Base 
{ 
    ChildType obj; 
    ... 
} 

Virtual inheritance in der Regel verwendet, definieren kann, um die diamond problem zu lösen, aber ich denke, Sie es dieses Problem auch lösen können.

Wenn meine Annahme falsch ist, dann zögern Sie mich zu ignorieren.