2015-12-03 13 views
7

Ich fragte mich, ob jemand weiß, ob es möglich ist, Vererbung in einer Union irgendwie zu verwenden.Verwendung der Vererbung innerhalb einer Union

Im Beispiel unten, die TestFails Union nicht enthalten die a Variable innerhalb der Base Struktur, während TestWorks Arbeit macht.

struct Base { int a; }; 

union TestFails 
{ 
    struct : public Base {}; 
    int b; 
}; 

union TestWorks 
{ 
    struct { int a; }; 
    int b; 
}; 

int main() 
{ 
    TestWorks works; 
    works.a = 0; 

    TestFails fails; 
    fails.a = 0; 

    return 0; 
} 

können Sie den Code testen hier: http://ideone.com/dUzpOR

+0

Aus Neugier, warum willst du das? – Cameron

+0

Ich habe ein paar Gewerkschaften, die etwas aufräumen müssen, deren Inhalt ziemlich ähnlich ist, also hoffte ich, einige Basisdatenstrukturen zu haben, die ich wiederverwenden könnte. – Artoo

+0

FWIW, dies scheint nicht spezifisch für Gewerkschaften zu sein: http://ideone.com/9VGAkz – immibis

Antwort

0

Nicht sicher, ob es hilft, aber das funktioniert:

struct Base { int a; }; 
struct Foo : Base { int b;}; 
union TestFailsNot { 
    Base base; 
    Foo foo; 
    int b; 
}; 

int main() { 
    TestFailsNot failsNot; 
    failsNot.foo.a = 0;  
    failsNot.base.a = 3; // maybe not what you want to do, but it works 
} 
+0

@Cameron aktualisiert die Antwort – user463035818

1

Zunächst einmal - Ihre Annahme, dass TestWorks Werke falsch ist. Dies ist nicht Standard-C++ - nur Erweiterung - es unnamed anonymous struct genannt wird - und wenn Sie mit pedantisch Optionen kompilieren Sie erhalten:

prog.cc:5:27: error: ISO C++ prohibits anonymous structs [-Wpedantic]
struct : public Base {};

     ^

prog.cc:11:22: error: ISO C++ prohibits anonymous structs [-Wpedantic]
struct { int a; };

Ihr Problem zu lösen - nur diese anonymen structs nennen :

union TestFails 
{ 
    struct : public Base {} s; 
    //     ^
    int b; 
}; 

union TestWorks 
{ 
    struct { int a; } s; 
    //    ^
    int b; 
}; 
+0

Ich wusste, dass anonyme Strukturen nicht Standard sind, aber das ist genau das, was ich versuchte zu vermeiden, wie oben mein Kommentar. Danke für deine Hilfe trotzdem. – Artoo

1

Die Antwort ist nein. Es gibt eine Menge dunkler Ecken in C++, aber das ist nicht eine davon :)

Klassen und Strukturen haben Vererbung. Gewerkschaften nicht.

Der einzige Weg zu erreichen, was Sie wollen ... ist die Gewerkschaften structs Refactoring (ich sage structs nur, weil sie einen Standard öffentlichen Umfang haben, so dass Sie sie öffentlich nicht erklären müssen)

Wenn Sie versuchen, eine Struktur innerhalb Ihrer Vereinigung zu platzieren, müssen Sie den zusätzlichen Geltungsbereich der neuen Struktur hinzufügen, um auf ihren Wert zuzugreifen.

Genau wie AndyG Antwort zeigt dies:

union TestFails 
{ 
    struct foo: public Base {}; 
    foo f; 
    int b; 
}; 

TestFails fails; 
fails.f.a = 42; 
std::cout << fails.f.a << std::endl; 

Wenn Sie weglassen eine Variable namens und erstellen einen ungenannten Umfang, die von außen werden kann mit Namensräumen durchgeführt wird gelegentlich dann die Daten nicht zugegriffen wird (was der Punkt dieser ist an erster Stelle)

+0

Unionsvererbung wird hier nicht diskutiert, die Vererbung betrifft eine Struktur innerhalb einer Union, was meines Wissens ein ganz anderes Problem ist. Können Sie Ihre Lösung bitte mit Namespaces erweitern? – Artoo

+1

Ich verstehe, dass Union Vererbung nicht Ihre Frage ist, aber der einzige Weg, um Ihr Ziel zu erreichen, ist die Vererbung. Indem Sie in eine Struktur umstrukturieren, können Sie auf den Wert 1 tief in Ihrer Vereinigung zugreifen, so dass Sie nur auf den Wert als 'f.a' anstatt auf, f.s.a' zugreifen. Dies entspricht der 'is a'-Beziehung gegenüber der' has a'-Beziehung, von der Sie sich gerade nähern – Dan

+0

Der Punkt über unbenannte Namespaces geht nur mit allem anderen anonym/unbenannt einher. Sie sind nicht für den externen Zugriff gedacht oder sie sind temporär. – Dan

Verwandte Themen