c++ Kopiera mellan nedärvda klasser.

Permalänk

c++ Kopiera mellan nedärvda klasser.

Hej.

Jag har en basklass A, en nedärvd klass B, och ytterligare en klass C som ärver av B.

Skillnaden mellan klass B och C är ytterst liten.

I basklassen finns en copy-constructor:

A(A & a): value(a.value){}

Jag vill kunna kopiera mellan B och C:

B first;
C second;
B = C;

eller

B first;
C second(first);

Som det är nu får jag felet:

"no matching function for call to C::C(B &)"

Går det att lösa, eller måste jag ändra på arvets struktur. Blir det lättare om både B och C ärver direkt från A?

Exempel på hur jag menar:

I Main.cpp #include "b.h" #include "c.h" int main() { B first; C second; first = second; return 0; } I b.h: #include "A.h" class B : public A {}; I c.h: #include "B.h" class C : public B {};

Visa signatur

Avatarkreds till: http://imgur.com/HOxIL
Alakai säger: Ryssen skrattar. Norrland hembränner på uppdrag av regeringen. Sälar dör i blyförgiftning, fulla och glada. Förvirringen är total. Kungen är nöjd.

Permalänk
Medlem

Felet är som kompilatorn säger att det inte finns en sådan copy-konstruktor. I A måste måste den i så fall vara virtuell för att subklasser ska ha tillgång till den, men jag är relativt säker på att konstruktorer inte kan vara virtuella (jag förstår i alla fall inte hur det skulle kunna gå till).

Jag borde kanske poängtera att jag inte är någon expert på området, men det jag kan komma på på rak arm är att du kanske kan skapa copy() funktioner i klasserna och sedan anropa dessa (och göra copy-konstruktorer som faktiskt tar emot A eller B objekt i C klassen o.s.v. om du fortfarande vill kunna skriva B = C). Du kan även återanvända superklassernas copy() funktioner i subklasserna genom att skriva t.ex. A::copy() eller B::copy(), och sedan låta varje funktion bara kopiera det innehåll som är specifikt för just den klassen. Sen kan du även återanvända dessa i copy-konstruktorerna själva för att minimera kodduplikation. Tänk dock på att om du vill kopiera ett A objekt till ett C eller B objekt så saknas det viss information (variabler som finns i C eller B men inte i A) som du "måste" initiera manuellt.

Permalänk
Medlem

du kan nog överlagra = operatiorn i klasserna typ Classes (II)

b c::operator=(c copy)

sen får du koda en överföring melan dom två

alt lägga till en contructor i b classen med c parameter

edit:

såg att c ärver b, då borde du kunna casta den direkt till b
Type Casting

Visa signatur

orka