Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Multipel Arv | Oversigt over Arv
C++ OOP

book
Multipel Arv

Multipel arv tillader en afledt klasse at arve fra flere basisklasser. Dette betyder, at en enkelt afledt klasse kan få adgang til medlemmer (data og funktioner) fra flere basisklasser og dermed kombinere deres egenskaber og adfærd.

Horisontal multipel arv

Ved denne type multipel arv arver en klasse egenskaber og metoder fra flere superklasser på samme niveau i arvshierarkiet. Overvej classes: Shape og Color, som hver har forskellige egenskaber og metoder. Shape definerer formen på et object, og Color definerer dets farve.

Shape.h

Shape.h

Color.h

Color.h

copy
class Shape {
public:
void setShape(const std::string& value) { shape = value; }
std::string getShape() { return shape; }
private:
std::string shape;
};
1234567
class Shape { public: void setShape(const std::string& value) { shape = value; } std::string getShape() { return shape; } private: std::string shape; };

Lad os nu oprette en subklasse kaldet ColoredShape, der arver egenskaber og metoder fra både klasserne Shape og Color.

ColoredShape.h

ColoredShape.h

copy
#include "Shape.h"
#include "Color.h"

class ColoredShape : public Shape, public Color {
public:
void describe() {
std::cout << "This object is a " << getShape() << " shape and is " << getColor() << '\n';
}
};
123456789
#include "Shape.h" #include "Color.h" class ColoredShape : public Shape, public Color { public: void describe() { std::cout << "This object is a " << getShape() << " shape and is " << getColor() << '\n'; } };

Vertikal arv

Ved dybdearv arver en class egenskaber og metoder fra sin direkte forælder og dens forfædre, hvilket danner en arve-kæde. For eksempel kan class Vehicle fungere som grundlag for arv for Car, Truck og andre. I vores eksempel vil vi benytte Car til at illustrere konceptet.

Vehicle.h

Vehicle.h

Car.h

Car.h

copy
class Vehicle {
public:
void start() { std::cout << "Vehicle started"; }
void stop() { std::cout << "Vehicle stopped"; }
};
12345
class Vehicle { public: void start() { std::cout << "Vehicle started"; } void stop() { std::cout << "Vehicle stopped"; } };

For at opnå vertikal arv, skal du oprette et hierarki, hvor én class arver fra en anden, og derefter arver en efterfølgende klasse fra den første, og så videre. Vi kan oprette en ElectricCar, der arver alle egenskaber og funktionaliteter fra Car, som selv arver fra Vehicle, hvilket etablerer en kompleks multipel arv struktur.

ElectricCar.h

ElectricCar.h

copy
#include "Car.h"

class ElectricCar : public Car {
public:
void charge() { std::cout << "Electric car is charging"; }
};
123456
#include "Car.h" class ElectricCar : public Car { public: void charge() { std::cout << "Electric car is charging"; } };

Hvorfor er multipel arv nødvendig

Multipel arv giver fleksibilitet og genbrug af kode i situationer, hvor en class skal udvise egenskaber eller karakteristika fra mere end én forældre-class. Her er nogle scenarier, hvor multipel arv er fordelagtig:

  • Virkelige roller: en flyvende fugl kan kombinere egenskaber fra både Flying og Bird klasserne, hvilket repræsenterer begge evner. Flying klassen kan også anvendes på fly eller andre flyvende objekter.

  • Genbrug af kode: multipel arv gør det muligt for en klasse at genbruge funktioner fra forskellige basisklasser uden duplikering.

  • Fokuserede grænseflader: opmuntrer til at kombinere små, specifikke grænseflader i stedet for at bruge én stor, generel.

Note
Bemærk

Opdel et komplekst objekt i enklere dele og udnyt multipel arv til at skabe fleksibel og vedligeholdelsesvenlig software.

question mark

Hvilket af følgende udsagn om horisontal arv er korrekt?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 3

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

We use cookies to make your experience better!
some-alt