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 61 62 63 64
|
#include <iostream>
#include <string>
using namespace std;
class VehicleBase
{
// original Vehicle members, not implementing the
// redefinable interface
template <class Derived>
friend class Vehicle;
size_t d_massFactor = 1;
};
class CarBase: public virtual VehicleBase
{
// original Car members, not implementing the
// redefinable interface
int x = 1000;
friend class Car;
};
class TruckBase: public CarBase
{
// original Truck members, not implementing the
// redefinable interface
friend class Truck;
};
template <class Derived>
class Vehicle: public virtual VehicleBase
{
public:
int mass() const
{
return d_massFactor *
static_cast<Derived const *>(this)->vmass();
}
};
class Car: public CarBase, public Vehicle<Car>
{
friend class Vehicle<Car>;
int vmass() const
{
return x;
}
};
class Truck: public TruckBase, public Vehicle<Truck>
{
friend class Vehicle<Truck>;
private:
int vmass() const
{
return 15000;
}
};
|