forked from CaptGreg/SenecaOOP345-attic
-
Notifications
You must be signed in to change notification settings - Fork 0
/
clone-simple.cpp
60 lines (49 loc) · 1.91 KB
/
clone-simple.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// https://katyscode.wordpress.com/2013/08/22/c-polymorphic-cloning-and-the-crtp-curiously-recurring-template-pattern/
#include <iostream>
#include <typeinfo> // typeid(...), typeid(...).name()
using namespace std;
int main()
{
class Vehicle // ABC: abstract base class
{
public:
virtual ~Vehicle() {}
virtual Vehicle *clone() const = 0;
virtual void describe() const = 0;
};
class Car : public Vehicle
{
public:
virtual Car *clone() const { return new Car(*this); } // Covariant Return Types
virtual void describe() const { cout << typeid(*this).name() << " -> I am a car\n"; } };
class Plane : public Vehicle
{
public:
virtual Plane *clone() const { return new Plane(*this); } // Covariant Return Types
virtual void describe() const { cout << typeid(*this).name() << " -> I am a plane\n"; }
};
class PassengerPlane : public Plane
{
public:
virtual PassengerPlane *clone() const { return new PassengerPlane(*this); } // Covariant Return Types
virtual void describe() const { cout << typeid(*this).name() << " -> I am a PassengerPlane I was derived from (my base class) -->"; Plane::describe(); }
};
Vehicle *vehicleUnknown;
Vehicle *car = new Car();
Vehicle *plane = new Plane();
Vehicle *passengerplane = new PassengerPlane();
car->describe();
plane->describe();
passengerplane->describe();
cout << "+++ vehicleUnknown = cloned plane\n";
vehicleUnknown = plane->clone();
vehicleUnknown->describe();
cout << "+++ vehicleUnknown = cloned car\n";
vehicleUnknown = car->clone();
vehicleUnknown->describe();
cout << "+++ vehicleUnknown = cloned passenger plane\n";
vehicleUnknown = passengerplane->clone();
vehicleUnknown->describe();
return 0;
}