Sorry for the large amount of source code. There are three abstract classes P, L, PL. The third class PL is derived from classes P and L, using virtual inheritance:
template <typename T> //Abstract class class P { public: virtual ~P() = 0; virtual P <T> *clone() const = 0; }; template <typename T> P<T>::~P() {} template <typename T> P<T> * P <T>:: clone() const { return new P <T> ( *this ); } template <typename T> //Abstract class class L { public: virtual ~L() = 0; virtual L <T> *clone() const = 0; }; template <typename T> L<T>::~L() {} template <typename T> L<T> *L <T> ::clone() const { return new L <T> ( *this );} template <typename T> class PL: virtual public P <T>, virtual public L <T> //Abstract class { public: PL() : P <T>(), L<T>() {} virtual ~PL() = 0; virtual PL <T> *clone() const = 0; }; template <typename T> PL<T>::~PL() {} template <typename T> PL<T> * PL <T> :: clone() const { return new PL <T> ( *this );}
Each class has its own implementation of the clone method.
The following two classes PA, PC are made from class P using virtual inheritance:
template <typename T> class PC : virtual public P <T> { public: PC() : P <T> () {} virtual ~PC() {} virtual PC <T> *clone() const {return new PC <T> ( *this );} }; template <typename T> class PA : virtual public P <T> { public: PA() : P <T> () {} virtual ~PA() {} virtual PA <T> *clone() const {return new PA <T> ( *this );} };
The last two classes PCL and PAL are duplicated using virtual inheritance from PC and PL, PA and PL.
template <typename T> class PCL : public PC <T>, public PL <T> { public: PCL() : P <T> (), PC <T> (), PL <T> () {} virtual ~PCL() {} virtual PCL <T> *clone() const {return new PCL <T> ( *this );} }; template <typename T> class PAL : public PA <T>, public PL <T> { public: PAL() : P <T> (), PA <T> (), PL <T> () {} virtual ~PAL() {} virtual PAL <T> *clone() const {return new PAL <T> ( *this );}
};
There is a class dependency diagram:
.......... P .... L..... ........../|\..../...... ........./.|.\../....... ......../..|..\/........ .......PC..PA..PL....... .......|...|.../|....... .......|...|../.|....... .......|...PAL..|....... .......|........|....... .......PCL_____/........
Please do not discuss this proposal :-))). I have the following 3 questions:
1) Was this class dependency correctly rewritten in C ++ (first of all, the location of the "virtual")?
2) I'm not sure what is wrong, see the code, please:
int main(int argc, _TCHAR* argv[]) { PCL <double> * pcl = new PCL <double>();
It is not possible to create new objects of the PAL / PCL classes, both classes are marked as abstract. But they are not abstract. Where is the problem?
3) Can polymorphism be used with the clone () method? See code above, please ...
Thanks for your help...
UPDATE QUESTION
I have adjusted the code. But the following error appears using the VS 2010 compiler:
template <typename T> //Abstract class class P { public: virtual ~P() = 0; virtual P <T> *clone() const = 0; }; template <typename T> P<T>::~P() {} template <typename T> P<T> * P <T>:: clone() const { return new P <T> ( *this ); } template <typename T> //Abstract class class L { public: virtual ~L() = 0; virtual L <T> *clone() const = 0; }; template <typename T> L<T>::~L() {} template <typename T> L<T> *L <T> ::clone() const { return new L <T> ( *this );} template <typename T> class PL: virtual public P <T>, virtual public L <T> //Abstract class { public: PL() : P <T>(), L<T>() {} virtual ~PL() = 0; virtual PL <T> *clone() const = 0; }; template <typename T> PL<T>::~PL() {} template <typename T> PL<T> * PL <T> :: clone() const { return new PL <T> ( *this );} template <typename T> class PC : virtual public P <T> { protected: T pc; public: PC() : P <T> () {} virtual ~PC() {} virtual PC <T> *clone() const {return new PC <T> ( *this );} }; template <typename T> class PA : virtual public P <T> { public: PA() : P <T> () {} virtual ~PA() {} virtual PA <T> *clone() const {return new PA <T> ( *this );} }; template <typename T> class PCL : public PC <T>, public PL <T> { public: PCL() : P <T> (), PC <T> (), PL <T> () {} virtual ~PCL() {} virtual PCL <T> *clone() const {return new PCL <T> ( *this );} }; //Error using VS 2010: Error 1 error C2250: 'PCL<T>' : ambiguous inheritance of 'PC<T> *P<T>::clone(void) const' template <typename T> class PAL : public PA <T>, public PL <T> { public: PAL() : P <T> (), PA <T> (), PL <T> () {} virtual ~PAL() {} virtual PAL <T> *clone() const {return new PAL <T> ( *this );} }; //Error VS 2010: Error 1 error C2250: 'PAL<T>' : ambiguous inheritance of 'PA<T> *P<T>::clone(void) const' int main(int argc, char* argv[]) { PCL <double> * pcl = new PCL <double>(); PAL <double> * pal = new PAL <double>(); PL <double> *pl1 = pcl->clone(); PL <double> *pl2 = pal->clone(); return 0; }
Maybe I missed something ... But g ++ compiles this code in order.